summaryrefslogtreecommitdiffstats
path: root/dxsdk/Include/DShowIDL
diff options
context:
space:
mode:
Diffstat (limited to 'dxsdk/Include/DShowIDL')
-rw-r--r--dxsdk/Include/DShowIDL/Bdatif.idl678
-rw-r--r--dxsdk/Include/DShowIDL/Mpeg2Data.idl303
-rw-r--r--dxsdk/Include/DShowIDL/Mpeg2Structs.idl368
-rw-r--r--dxsdk/Include/DShowIDL/Mstvca.idl840
-rw-r--r--dxsdk/Include/DShowIDL/Mstvgs.idl837
-rw-r--r--dxsdk/Include/DShowIDL/Msvidctl.idl715
-rw-r--r--dxsdk/Include/DShowIDL/Segment.idl1349
-rw-r--r--dxsdk/Include/DShowIDL/Videoacc.idl172
-rw-r--r--dxsdk/Include/DShowIDL/Vmrender.idl1092
-rw-r--r--dxsdk/Include/DShowIDL/amstream.idl334
-rw-r--r--dxsdk/Include/DShowIDL/austream.idl106
-rw-r--r--dxsdk/Include/DShowIDL/axcore.idl1284
-rw-r--r--dxsdk/Include/DShowIDL/axextend.idl5169
-rw-r--r--dxsdk/Include/DShowIDL/bdaiface.idl1013
-rw-r--r--dxsdk/Include/DShowIDL/control.odl912
-rw-r--r--dxsdk/Include/DShowIDL/ddstream.idl86
-rw-r--r--dxsdk/Include/DShowIDL/devenum.idl38
-rw-r--r--dxsdk/Include/DShowIDL/dmodshow.idl33
-rw-r--r--dxsdk/Include/DShowIDL/dshowasf.idl59
-rw-r--r--dxsdk/Include/DShowIDL/dvdif.idl2326
-rw-r--r--dxsdk/Include/DShowIDL/dxtrans.idl1289
-rw-r--r--dxsdk/Include/DShowIDL/dyngraph.idl318
-rw-r--r--dxsdk/Include/DShowIDL/mediaobj.idl411
-rw-r--r--dxsdk/Include/DShowIDL/medparam.idl228
-rw-r--r--dxsdk/Include/DShowIDL/mixerocx.idl72
-rw-r--r--dxsdk/Include/DShowIDL/mmstream.idl190
-rw-r--r--dxsdk/Include/DShowIDL/mstve.idl1450
-rw-r--r--dxsdk/Include/DShowIDL/qedit.idl1734
-rw-r--r--dxsdk/Include/DShowIDL/regbag.idl52
-rw-r--r--dxsdk/Include/DShowIDL/sbe.idl1348
-rw-r--r--dxsdk/Include/DShowIDL/strmif.idl51
-rw-r--r--dxsdk/Include/DShowIDL/tuner.idl2254
-rw-r--r--dxsdk/Include/DShowIDL/tvratings.idl242
-rw-r--r--dxsdk/Include/DShowIDL/vidcap.idl84
-rw-r--r--dxsdk/Include/DShowIDL/vmr9.idl1057
35 files changed, 28494 insertions, 0 deletions
diff --git a/dxsdk/Include/DShowIDL/Bdatif.idl b/dxsdk/Include/DShowIDL/Bdatif.idl
new file mode 100644
index 00000000..bc94db40
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Bdatif.idl
@@ -0,0 +1,678 @@
+//---------------------------------------------------------------------
+//
+// Copyright (c) 1999-2002 Microsoft Corporation
+//
+// BDATIF.idl
+//
+//---------------------------------------------------------------------
+
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Microsoft Windows")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2002.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("#if ( _MSC_VER >= 800 )")
+cpp_quote("#pragma warning(disable:4201) /* Nameless struct/union */")
+cpp_quote("#endif")
+cpp_quote("#if ( _MSC_VER >= 1020 )")
+cpp_quote("#pragma once")
+cpp_quote("#endif")
+
+
+//---------------------------------------------------------------------
+// IUnknown import idl
+//---------------------------------------------------------------------
+
+#ifndef DO_NO_IMPORTS
+import "unknwn.idl";
+import "strmif.idl";
+import "tuner.idl";
+import "bdaiface.idl";
+#endif
+
+
+interface IMPEG2_TIF_CONTROL;
+interface IATSCChannelInfo;
+interface IMPEG2PIDMap;
+
+
+
+
+//******************************************************************************
+//
+// IBDA_TIF_REGISTRATION interface
+//
+// Implemented by the Microsoft ATSC/DVB BDA Network Provider
+//
+// Used by a transport information filter (TIF) to Register with the NP
+// AND obtain an Interface to the Demux to set/ Remove PIDs.The TIF here passes
+// IUNKNOWN of the pin it is connecting to and obtains the IMPEG2PIDMAP interface
+// implemented by the NP to Map/ UnMap pids.
+//
+
+[
+ object,
+ uuid(DFEF4A68-EE61-415f-9CCB-CD95F2F98A3A),
+ helpstring("BDA Network Provider Registration Inteface for DVB/ATSC Transport Information Filters"),
+ pointer_default(unique)
+]
+interface IBDA_TIF_REGISTRATION : IUnknown
+{
+
+ [helpstring("Used to register a transport analyzer with the Network Provider")]
+ HRESULT
+ RegisterTIFEx (
+ [in] IPin * pTIFInputPin,
+ [in, out] ULONG * ppvRegistrationContext,
+ [in, out] IUnknown ** ppMpeg2DataControl
+ );
+
+ [helpstring("Used to unregister TIF with the Network Provider")]
+ HRESULT
+ UnregisterTIF (
+ [in] ULONG pvRegistrationContext
+ );
+}
+
+
+//******************************************************************************
+//
+// IMPEG2_TIF_CONTROL interface
+//
+// Implemented by the Microsoft ATSC/DVB BDA Network Provider
+//
+// Used by a transport information filter (TIF) to request table
+// sections carried on specific PIDs within the transport stream.
+// The Network Provider Filter will, in turn, do the necessary
+// control on the Demux Filter. All sections are delivered as comlete
+// mpeg2 table sections via the TIF's connection to the Demux Filter.
+//
+[
+ object,
+ uuid(F9BAC2F9-4149-4916-B2EF-FAA202326862),
+ helpstring("BDA Network Provider Inteface for DVB/ATSC Transport Information Filters"),
+ pointer_default(unique)
+]
+interface IMPEG2_TIF_CONTROL : IUnknown
+{
+
+ [helpstring("Used to register a transport analyzer with the Network Provider")]
+ HRESULT
+ RegisterTIF (
+ [in] IUnknown * pUnkTIF,
+ [in, out] ULONG * ppvRegistrationContext
+ );
+
+ [helpstring("Used to unregister TIF with the Network Provider")]
+ HRESULT
+ UnregisterTIF (
+ [in] ULONG pvRegistrationContext
+ );
+
+ [helpstring("Used to add PSI/SI MPEG2 packet IDs to the TIF's data stream")]
+ HRESULT
+ AddPIDs (
+ [in] ULONG ulcPIDs,
+ [in] ULONG * pulPIDs
+ );
+
+ [helpstring("Used to remove PSI/SI MPEG2 packet IDs from the TIF's data stream")]
+ HRESULT
+ DeletePIDs (
+ [in] ULONG ulcPIDs,
+ [in] ULONG * pulPIDs
+ );
+
+ [helpstring("Returns the number of MPEG2 Packet IDs being filtered into the TIF's input data.")]
+ HRESULT
+ GetPIDCount (
+ [out] ULONG * pulcPIDs
+ );
+
+ [helpstring("Returns the the list of MPEG2 Packet IDs being filtered into the TIF's input data.")]
+ HRESULT
+ GetPIDs (
+ [out] ULONG * pulcPIDs,
+ [out] ULONG * pulPIDs
+ );
+
+}
+
+
+//******************************************************************************
+//
+// ITuneRequestInfo interface
+//
+// Implemented by a BDA transport information filter (TIF)
+//
+// Used by the BDA Network Provider to obtain network specific
+// information about locating transport streams and aquiring
+// services.
+//
+//
+// GetLocatorData -
+//
+// GetComponentData -
+//
+// CreateComponentList -
+//
+// GetNextService -
+//
+// GetPreviouService -
+//
+// GetNextLocator -
+//
+// GetPreviousLocator -
+//
+[
+ object,
+ uuid(A3B152DF-7A90-4218-AC54-9830BEE8C0B6),
+ helpstring("Interface provided by the Mpeg2 Transport Information Filter to supply tuning details."),
+ pointer_default(unique)
+]
+interface ITuneRequestInfo : IUnknown
+{
+
+ [helpstring("TIF fills in channel/program locator information for the given tune request.")]
+ HRESULT
+ GetLocatorData (
+ [in] ITuneRequest *Request
+ );
+
+ [helpstring("TIF fills in all network specific component data for the existing component list on the given tune request.")]
+ HRESULT
+ GetComponentData (
+ [in] ITuneRequest *CurrentRequest
+ );
+
+ [helpstring("TIF creates a complete component list and fills in all network specific component data on the given tune request")]
+ HRESULT
+ CreateComponentList (
+ [in] ITuneRequest *CurrentRequest
+ );
+
+ [helpstring("TIF creates a new TuneRequest with channel/program locator information for the next service.")]
+ HRESULT
+ GetNextProgram (
+ [in] ITuneRequest *CurrentRequest,
+ [out, retval] ITuneRequest **TuneRequest
+ );
+
+ [helpstring("TIF creates a new TuneRequest with channel/program locator information for the previous service.")]
+ HRESULT
+ GetPreviousProgram (
+ [in] ITuneRequest *CurrentRequest,
+ [out, retval] ITuneRequest **TuneRequest
+ );
+
+ [helpstring("TIF creates a new TuneRequest with locator information for the next transport stream.")]
+ HRESULT
+ GetNextLocator (
+ [in] ITuneRequest *CurrentRequest,
+ [out, retval] ITuneRequest **TuneRequest
+ );
+
+ [helpstring("TIF creates a new TuneRequest with locator information for the previous transport stream.")]
+ HRESULT
+ GetPreviousLocator (
+ [in] ITuneRequest *CurrentRequest,
+ [out, retval] ITuneRequest **TuneRequest
+ );
+}
+
+
+//******************************************************************************
+//
+// IGuideDataEvent
+//
+// This is the guide data event notification callback interface. The
+// callback interface is registered on a transport analyzer's
+// IConnectionPoint by the event consumer.
+//
+// The event consumer MUST NOT BLOCK THE CALLING THREAD.
+//
+// If the consumer requires additional information about the event, it
+// should queue the event to a separate thread.
+//
+// {EFDA0C80-F395-42c3-9B3C-56B37DEC7BB7}
+//
+[
+ object,
+ uuid(EFDA0C80-F395-42c3-9B3C-56B37DEC7BB7),
+ helpstring("Consumers of a guide data events must implement this callback interface."),
+ pointer_default(unique)
+]
+interface IGuideDataEvent : IUnknown
+{
+ // Indicates that a complete set of guide data has been acquire from
+ // the current transport stream.
+ //
+ // MANDATORY - If a transport analyzer supports IGuideDataEvent then
+ // it must supply this event.
+ //
+ HRESULT GuideDataAcquired(
+ );
+
+ // Indicates that information about one or more programs changed.
+ //
+ // If varProgramDescriptionID is NULL then the consumer
+ // must get properties for all programs to determine which ones
+ // changed.
+ //
+ // MANDATORY - If a transport analyzer supports IGuideDataEvent then
+ // it must supply this event.
+ //
+ HRESULT ProgramChanged(
+ [in] VARIANT varProgramDescriptionID
+ );
+
+ // Indicates that information about one or more services changed.
+ //
+ // If varServiceDescriptionID is NULL then the consumer
+ // must get properties for all services to determine which ones
+ // changed.
+ //
+ // MANDATORY - If a transport analyzer supports IGuideDataEvent then
+ // it must supply this event.
+ //
+ HRESULT ServiceChanged(
+ [in] VARIANT varServiceDescriptionID
+ );
+
+ // Indicates that information about one or more schedule entries
+ // changed.
+ //
+ // If varScheduleEntryDescriptionID is NULL then the consumer
+ // must get properties for all schedule entries to determine which ones
+ // changed.
+ //
+ // MANDATORY - If a transport analyzer supports IGuideDataEvent then
+ // it must supply this event.
+ //
+ HRESULT ScheduleEntryChanged(
+ [in] VARIANT varScheduleEntryDescriptionID
+ );
+
+ // Indicates that the program with the given Description.ID
+ // has been deleted.
+ //
+ //
+ // Optional - Transport analyzer may supply this event. Consumer
+ // may return E_NOTIMPL.
+ //
+ HRESULT ProgramDeleted(
+ [in] VARIANT varProgramDescriptionID
+ );
+
+ // Indicates that the service with the given Description.ID
+ // has been deleted.
+ //
+ //
+ // Optional - Transport analyzer may supply this event. Consumer
+ // may return E_NOTIMPL.
+ //
+ HRESULT ServiceDeleted(
+ [in] VARIANT varServiceDescriptionID
+ );
+
+
+ // Indicates that the schedule entry with the given Description.ID
+ // has been deleted.
+ //
+ //
+ // Optional - Transport analyzer may supply this event. Consumer
+ // may return E_NOTIMPL.
+ //
+ HRESULT ScheduleDeleted(
+ [in] VARIANT varScheduleEntryDescriptionID
+ );
+}
+
+
+//******************************************************************************
+//
+// IGuideDataPropery
+//
+// {88EC5E58-BB73-41d6-99CE-66C524B8B591}
+//
+[
+ object,
+ uuid(88EC5E58-BB73-41d6-99CE-66C524B8B591),
+ helpstring("Interface provided by a transport analyzer to represent a guide data property."),
+ pointer_default(unique)
+]
+interface IGuideDataProperty : IUnknown
+{
+ [propget] HRESULT Name([out] BSTR *pbstrName);
+ [propget] HRESULT Language([out] long *idLang);
+ [propget] HRESULT Value([out] VARIANT *pvar);
+}
+
+
+//******************************************************************************
+//
+// IEnumGuideDataProperties
+//
+// {AE44423B-4571-475c-AD2C-F40A771D80EF}
+//
+[
+ object,
+ uuid(AE44423B-4571-475c-AD2C-F40A771D80EF),
+ helpstring("Interface provided by a transport analyzer to enumerate guide data properties."),
+ pointer_default(unique)
+]
+interface IEnumGuideDataProperties : IUnknown
+{
+ HRESULT Next([in] unsigned long celt, [out] IGuideDataProperty **ppprop, [out] unsigned long *pcelt);
+ HRESULT Skip([in] unsigned long celt);
+ HRESULT Reset();
+ HRESULT Clone([out] IEnumGuideDataProperties **ppenum);
+}
+
+
+//******************************************************************************
+//
+// IEnumTuneRequests
+//
+// {1993299C-CED6-4788-87A3-420067DCE0C7}
+//
+[
+ object,
+ uuid(1993299C-CED6-4788-87A3-420067DCE0C7),
+ helpstring("Interface provided by a transport analyzer to enumerate service tune requests ."),
+ pointer_default(unique)
+]
+interface IEnumTuneRequests : IUnknown
+{
+ HRESULT Next([in] unsigned long celt, [out] ITuneRequest **ppprop, [out] unsigned long *pcelt);
+ HRESULT Skip([in] unsigned long celt);
+ HRESULT Reset();
+ HRESULT Clone([out] IEnumTuneRequests **ppenum);
+}
+
+
+//******************************************************************************
+//
+// IGuideData
+//
+// {61571138-5B01-43cd-AEAF-60B784A0BF93}
+//
+[
+ object,
+ uuid(61571138-5B01-43cd-AEAF-60B784A0BF93),
+ helpstring("Interface provided by a transport analyzer to supply guide data information."),
+ pointer_default(unique)
+]
+interface IGuideData : IUnknown
+{
+ //-------------------------------------------------------------------------
+ //
+ // GetServices
+ // Returns an enumeration of tune requests for all services whose
+ // information is found in the current transport stream.
+ //
+ // Parameters
+ //
+ // IEnumTuneRequests **
+ // Location in which a reference to the resulting
+ // IEnumTuneRequests is placed. The caller must release
+ // this reference when finished with it.
+ //
+ // Comments
+ // This call is used to enumerate all services whose information
+ // can be found in the service descriptor table. Each tune request
+ // in the IEnumTuneRequest * contains the tune request including the
+ // locator data for the service.
+ //
+ [helpstring("Returns an enumeration of services whose information is found in the given transport stream")]
+ HRESULT
+ GetServices (
+ [out, retval] IEnumTuneRequests ** ppEnumTuneRequests
+ );
+
+
+ //-------------------------------------------------------------------------
+ //
+ // GetServiceProperties
+ // Returns an enumeration of all guide data properties for
+ // the service with the given Description.ID.
+ //
+ // Parameters
+ // ITuneRequest *
+ // Pointer to a tune request that contains information needed
+ // to indentify the requested transport stream.
+ // A NULL ITuneRequest * indicates that information about the
+ // current transport stream is requested.
+ //
+ // IEnumGuideDataProperties **
+ // Location in which a reference to the resulting
+ // IEnumGuideDataProperties is placed. The caller must release
+ // this reference when finished with it.
+ //
+ // Required Properties
+ // The following properties MUST be included in the returned
+ // property enumeration.
+ //
+ // Description.ID
+ // Uniquely identifies a service.
+ //
+ // Description.Name
+ // The default name to use for this service in the channel lineup.
+ //
+ // Description.Version
+ // Identifies the current version of the properties associated
+ // with this service.
+ //
+ // Provider.Name
+ // Name of the service provider (e.g. "KCTS")
+ //
+ // Provider.NetworkName
+ // Name of the network on which the service is provided.
+ // (e.g. "PBS")
+ //
+ // Service.TuneRequest
+ // Contains a tune request in the variant
+ //
+ //
+ [helpstring("Returns an enumeration of all guide data properties for the service specified by a tune request.")]
+ HRESULT
+ GetServiceProperties (
+ [in] ITuneRequest * pTuneRequest,
+ [out, retval] IEnumGuideDataProperties ** ppEnumProperties
+ );
+
+ //-------------------------------------------------------------------------
+ //
+ // GetProgramIDs
+ // Returns an enumeration of the unique identifiers (Description.ID)
+ // of programs with description contained in all transport
+ // streams
+ //
+ // Parameters
+ //
+ // IEnumVARIANT **
+ // Location in which a reference to the resulting
+ // IEnumVARIANT is placed. The caller must release
+ // this reference when finished with it.
+ //
+ // Comments
+ // This call is used to get a list of programs that have
+ // guide data properties in all transport streams.
+ // Each variant returned in the IEnumVARIANT * contains the
+ // unique Description.ID property for a program.
+ // Note that more than on transport stream may contain properties
+ // for the same program. In this case the properties should be
+ // merged.
+ //
+ [helpstring("Returns an enumeration of the Description.ID property for all programs on the given transport stream.")]
+ HRESULT
+ GetGuideProgramIDs (
+ [out, retval] IEnumVARIANT ** pEnumPrograms
+ );
+
+ //-------------------------------------------------------------------------
+ //
+ // GetProgramProperties
+ // Returns an enumeration of all guide data properties for
+ // the program with the given Description.ID.
+ //
+ // Parameters
+ // varProgramDescriptionID
+ // Variant containing the unique identifier for the program
+ // for which properties are requested.
+ //
+ // IEnumGuideDataProperties **
+ // Location in which a reference to the resulting
+ // IEnumGuideDataProperties is placed. The caller must release
+ // this reference when finished with it.
+ //
+ // Required Properties
+ // The following properties MUST be included in the returned
+ // property enumeration.
+ //
+ // Description.ID
+ // Uniquely identifies a program.
+ //
+ // Description.Version
+ // Identifies the current version of the properties associated
+ // with this program.
+ //
+ // Description.Title
+ // Human readable title of the program (e.g. "")
+ //
+ // Description.Long
+ // A description of the program.
+ //
+ [helpstring("Returns an enumeration of all guide data properties for the program with the given Description.ID.")]
+ HRESULT
+ GetProgramProperties (
+ [in] VARIANT varProgramDescriptionID,
+ [out, retval] IEnumGuideDataProperties ** ppEnumProperties
+ );
+
+ //-------------------------------------------------------------------------
+ //
+ // GetScheduleIDs
+ // Returns an enumeration of the unique identifiers (Description.ID)
+ // transport of schedule entries with description contained in the
+ // given transport stream.
+ //
+ // Parameters
+ //
+ // IEnumVARIANT **
+ // Location in which a reference to the resulting
+ // IEnumVARIANT is placed. The caller must release
+ // this reference when finished with it.
+ //
+ // Comments
+ // This call is used to get a list of schedule entries that have
+ // guide data properties in all transport streams.
+ // Each variant returned in the IEnumVARIANT * contains the
+ // unique Description.ID property for a schedule entry.
+ // Note that more than on transport stream may contain properties
+ // for the same schedule entry. In this case the properties
+ // should be merged.
+ //
+ [helpstring("Returns an enumeration of the Description.ID property for all schedule entries in the transport stream specified by a tune request.")]
+ HRESULT
+ GetScheduleEntryIDs (
+ [out, retval] IEnumVARIANT ** pEnumScheduleEntries
+ );
+
+ //-------------------------------------------------------------------------
+ //
+ // GetScheduleEntryProperties
+ // Returns an enumeration of all guide data properties for
+ // the schedule entry with the given Description.ID.
+ //
+ // Parameters
+ // varScheduleEntryDescriptionID
+ // Variant containing the unique identifier for the schedule
+ // entry for which properties are requested.
+ //
+ // IEnumGuideDataProperties **
+ // Location in which a reference to the resulting
+ // IEnumGuideDataProperties is placed. The caller must release
+ // this reference when finished with it.
+ //
+ // Required Properties
+ // The following properties MUST be included in the returned
+ // property enumeration.
+ //
+ // Description.ID
+ // Uniquely identifies a schedule entry.
+ //
+ // Description.Version
+ // Identifies the current version of the properties associated
+ // with this program.
+ //
+ // Time.Start
+ // The starting time and date of this schedule entry.
+ //
+ // Time.End
+ // The ending time and date of this schedule entry.
+ //
+ // Schedule.Program
+ // The Description.ID of the program that will play at the
+ // time specified by this schedule entry.
+ //
+ // Schedule.Service
+ // The Description.ID of the Service that carries the
+ // program that will play at the time specified by this
+ // schedule entry.
+ //
+ [helpstring("Returns an enumeration of all guide data properties for the schedule entry with the given Description.ID.")]
+ HRESULT
+ GetScheduleEntryProperties (
+ [in] VARIANT varScheduleEntryDescriptionID,
+ [out, retval] IEnumGuideDataProperties ** ppEnumProperties
+ );
+
+}
+
+
+//******************************************************************************
+//
+// IGuideDataLoader
+//
+// All Guide Data Loaders MUST implement this interface. It is how they are
+// provided with the IGuideData interface that they will use.
+//
+// {4764ff7c-fa95-4525-af4d-d32236db9e38}
+[
+ object,
+ uuid(4764ff7c-fa95-4525-af4d-d32236db9e38),
+ helpstring("IGuideDataLoader Interface"),
+ pointer_default(unique)
+]
+interface IGuideDataLoader : IUnknown
+{
+ HRESULT Init([in] IGuideData *pGuideStore);
+ HRESULT Terminate();
+};
+
+[
+ uuid(8224A083-7F8C-432D-B83E-3C5E9BDE3528),
+ version(1.0),
+ helpstring("psisload 1.0 Type Library")
+]
+library PSISLOADLib
+{
+ importlib("stdole32.tlb");
+ importlib("stdole2.tlb");
+
+ [
+ uuid(14EB8748-1753-4393-95AE-4F7E7A87AAD6),
+ helpstring("TIFLoad Class")
+ ]
+ coclass TIFLoad
+ {
+ interface IGuideDataLoader;
+ interface IGuideDataEvent;
+ };
+};
+
+cpp_quote("#if ( _MSC_VER >= 800 )")
+cpp_quote("#pragma warning(default:4201) /* Nameless struct/union */")
+cpp_quote("#endif")
diff --git a/dxsdk/Include/DShowIDL/Mpeg2Data.idl b/dxsdk/Include/DShowIDL/Mpeg2Data.idl
new file mode 100644
index 00000000..6762c49c
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Mpeg2Data.idl
@@ -0,0 +1,303 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Module Name:
+//
+// Mpeg2Data.idl
+//
+// Abstract:
+//
+// Main Mpeg2Data Library Definition, and interface definitions for
+// the MPEG-2 Section and Table acquisition functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+ // Import Files
+import "oaidl.idl";
+import "ocidl.idl";
+import "bdaiface.idl";
+
+ // Specify single byte packing alignment
+#pragma pack(push)
+#pragma pack(1)
+
+ // Forward interface declarations
+interface ISectionList;
+interface IMpeg2Stream;
+
+ // Declare well known PID/TID values for MPEG-2 tables
+cpp_quote("#define MPEG_PAT_PID 0x0000")
+cpp_quote("#define MPEG_PAT_TID 0x00")
+
+cpp_quote("#define MPEG_CAT_PID 0x0001")
+cpp_quote("#define MPEG_CAT_TID 0x01")
+
+cpp_quote("#define MPEG_PMT_TID 0x02")
+
+cpp_quote("#define MPEG_TSDT_PID 0x0002")
+cpp_quote("#define MPEG_TSDT_TID 0x03")
+
+ // Declare well known PID/TID values for ATSC tables
+cpp_quote("#define ATSC_MGT_PID 0x1FFB")
+cpp_quote("#define ATSC_MGT_TID 0xC7")
+
+cpp_quote("#define ATSC_VCT_PID 0x1FFB")
+cpp_quote("#define ATSC_VCT_TERR_TID 0xC8")
+cpp_quote("#define ATSC_VCT_CABL_TID 0xC9")
+
+cpp_quote("#define ATSC_RRT_PID 0x1FFB")
+cpp_quote("#define ATSC_RRT_TID 0xCA")
+
+cpp_quote("#define ATSC_EIT_TID 0xCB")
+
+cpp_quote("#define ATSC_ETT_TID 0xCC")
+
+cpp_quote("#define ATSC_STT_PID 0x1FFB")
+cpp_quote("#define ATSC_STT_TID 0xCD")
+
+cpp_quote("#define ATSC_PIT_TID 0xD0")
+
+ // Declare well known PID/TID values for DVB tables
+cpp_quote("#define DVB_NIT_PID 0x0010")
+cpp_quote("#define DVB_NIT_ACTUAL_TID 0x40")
+cpp_quote("#define DVB_NIT_OTHER_TID 0x41")
+
+cpp_quote("#define DVB_SDT_PID 0x0011")
+cpp_quote("#define DVB_SDT_ACTUAL_TID 0x42")
+cpp_quote("#define DVB_SDT_OTHER_TID 0x46")
+
+cpp_quote("#define DVB_BAT_PID 0x0011")
+cpp_quote("#define DVB_BAT_TID 0x4A")
+
+cpp_quote("#define DVB_EIT_PID 0x0012")
+cpp_quote("#define DVB_EIT_ACTUAL_TID 0x4E")
+cpp_quote("#define DVB_EIT_OTHER_TID 0x4F")
+
+cpp_quote("#define DVB_RST_PID 0x0013")
+cpp_quote("#define DVB_RST_TID 0x71")
+
+cpp_quote("#define DVB_TDT_PID 0x0014")
+cpp_quote("#define DVB_TDT_TID 0x70")
+
+cpp_quote("#define DVB_ST_PID_16 0x0010")
+cpp_quote("#define DVB_ST_PID_17 0x0011")
+cpp_quote("#define DVB_ST_PID_18 0x0012")
+cpp_quote("#define DVB_ST_PID_19 0x0013")
+cpp_quote("#define DVB_ST_PID_20 0x0014")
+cpp_quote("#define DVB_ST_TID 0x72")
+
+cpp_quote("#define DVB_TOT_PID 0x0014")
+cpp_quote("#define DVB_TOT_TID 0x73")
+
+cpp_quote("#define DVB_DIT_PID 0x001E")
+cpp_quote("#define DVB_DIT_TID 0x7E")
+
+cpp_quote("#define DVB_SIT_PID 0x001F")
+cpp_quote("#define DVB_SIT_TID 0x7F")
+
+ // Declare well known PID/TID values for ISDB tables
+cpp_quote("#define ISDB_DCT_PID 0x0017")
+cpp_quote("#define ISDB_DCT_TID 0xC0")
+
+cpp_quote("#define ISDB_LIT_PID 0x0020")
+cpp_quote("#define ISDB_LIT_TID 0xD0")
+
+cpp_quote("#define ISDB_ERT_PID 0x0021")
+cpp_quote("#define ISDB_ERT_TID 0xD1")
+
+cpp_quote("#define ISDB_ITT_TID 0xD2")
+
+cpp_quote("#define ISDB_DLT_TID 0xC1")
+
+cpp_quote("#define ISDB_PCAT_PID 0x0022")
+cpp_quote("#define ISDB_PCAT_TID 0xC2")
+
+cpp_quote("#define ISDB_SDTT_PID 0x0023")
+cpp_quote("#define ISDB_SDTT_TID 0xC3")
+
+
+
+////////////////////////////////////
+//
+// Mpeg2DataLib Library
+//
+////////////////////////////////////
+
+cpp_quote("class DECLSPEC_UUID(\"DBAF6C1B-B6A4-4898-AE65-204F0D9509A1\") Mpeg2DataLib;")
+
+[
+ uuid(DBAF6C1B-B6A4-4898-AE65-204F0D9509A1),
+ version(1.0)
+]
+library Mpeg2DataLib
+{
+ importlib("stdole32.tlb");
+ importlib("stdole2.tlb");
+
+ // Include related interface definition files so that everything ends up
+ // in the same library. Note that the order in which these files are
+ // included is important, so do not rearrange them arbitrarily
+#include "Mpeg2Structs.idl"
+#ifdef MPEG2_FUTURE_CODE // Not available in DX9
+#include "Mpeg2PsiParser.idl"
+#include "AtscPsipParser.idl"
+#include "DvbSiParser.idl"
+#endif
+
+
+
+ ////////////////////////////////////
+ //
+ // IMpeg2Data Interface
+ //
+ ////////////////////////////////////
+
+ [
+ object,
+ uuid(9B396D40-F380-4e3c-A514-1A82BF6EBFE6),
+ pointer_default(unique)
+ ]
+ interface IMpeg2Data : IUnknown
+ {
+ HRESULT GetSection([in] PID pid,
+ [in] TID tid,
+ [in] PMPEG2_FILTER pFilter, // OPTIONAL
+ [in] DWORD dwTimeout,
+ [out] ISectionList ** ppSectionList);
+
+ HRESULT GetTable([in] PID pid,
+ [in] TID tid,
+ [in] PMPEG2_FILTER pFilter, // OPTIONAL
+ [in] DWORD dwTimeout,
+ [out] ISectionList ** ppSectionList);
+
+ HRESULT GetStreamOfSections([in] PID pid,
+ [in] TID tid,
+ [in] PMPEG2_FILTER pFilter, // OPTIONAL
+ [in] HANDLE hDataReadyEvent,
+ [out] IMpeg2Stream ** ppMpegStream);
+ };
+
+
+
+ ////////////////////////////////////
+ //
+ // ISectionList Interface
+ //
+ ////////////////////////////////////
+
+ [
+ object,
+ uuid(AFEC1EB5-2A64-46c6-BF4B-AE3CCB6AFDB0),
+ pointer_default(unique)
+ ]
+ interface ISectionList : IUnknown
+ {
+ HRESULT Initialize([in] MPEG_REQUEST_TYPE requestType,
+ [in] IMpeg2Data * pMpeg2Data,
+ [in] PMPEG_CONTEXT pContext,
+ [in] PID pid,
+ [in] TID tid,
+ [in] PMPEG2_FILTER pFilter, // OPTIONAL
+ [in] DWORD timeout,
+ [in] HANDLE hDoneEvent); // OPTIONAL
+
+ HRESULT InitializeWithRawSections([in] PMPEG_PACKET_LIST pmplSections);
+
+ HRESULT CancelPendingRequest(void);
+
+ HRESULT GetNumberOfSections([out] WORD * pCount);
+
+ HRESULT GetSectionData([in] WORD sectionNumber,
+ [out] DWORD * pdwRawPacketLength,
+ [out] PSECTION * ppSection);
+
+ HRESULT GetProgramIdentifier(PID * pPid);
+
+ HRESULT GetTableIdentifier(TID * pTableId);
+ };
+
+
+
+ ////////////////////////////////////
+ //
+ // IMpeg2Stream Interface
+ //
+ ////////////////////////////////////
+
+ [
+ object,
+ uuid(400CC286-32A0-4ce4-9041-39571125A635),
+ pointer_default(unique)
+ ]
+ interface IMpeg2Stream : IUnknown
+ {
+ HRESULT Initialize([in] MPEG_REQUEST_TYPE requestType,
+ [in] IMpeg2Data * pMpeg2Data,
+ [in] PMPEG_CONTEXT pContext,
+ [in] PID pid,
+ [in] TID tid,
+ [in] PMPEG2_FILTER pFilter, // OPTIONAL
+ [in] HANDLE hDataReadyEvent);
+
+ HRESULT SupplyDataBuffer([in] PMPEG_STREAM_BUFFER pStreamBuffer);
+ };
+
+
+
+ ////////////////////////////////////
+ //
+ // SectionList CoClass
+ //
+ ////////////////////////////////////
+
+ [
+ uuid(73DA5D04-4347-45d3-A9DC-FAE9DDBE558D)
+ ]
+ coclass SectionList
+ {
+ [default] interface ISectionList;
+ };
+
+
+
+ ////////////////////////////////////
+ //
+ // Mpeg2Stream CoClass
+ //
+ ////////////////////////////////////
+
+ [
+ uuid(F91D96C7-8509-4d0b-AB26-A0DD10904BB7)
+ ]
+ coclass Mpeg2Stream
+ {
+ [default] interface IMpeg2Stream;
+ };
+
+
+
+ ////////////////////////////////////
+ //
+ // Mpeg2Data CoClass
+ //
+ ////////////////////////////////////
+
+ [
+ uuid(C666E115-BB62-4027-A113-82D643FE2D99)
+ ]
+ coclass Mpeg2Data
+ {
+ [default] interface IMpeg2Data;
+#ifdef MPEG2_FUTURE_CODE // Not available in DX9
+ interface IAtscPsipParser;
+ interface IDvbSiParser;
+#endif
+ };
+};
+
+
+
+ // Return to default packing
+#pragma pack(pop)
diff --git a/dxsdk/Include/DShowIDL/Mpeg2Structs.idl b/dxsdk/Include/DShowIDL/Mpeg2Structs.idl
new file mode 100644
index 00000000..e04353f4
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Mpeg2Structs.idl
@@ -0,0 +1,368 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Module Name:
+//
+// Mpeg2Structs.idl
+//
+// Abstract:
+//
+// Definitions for the common structures used in Mpeg2Data
+//
+// Notes:
+//
+// This IDL file is not built independently, but is included and built
+// in the master IDL file Mpeg2Data.idl
+//
+/////////////////////////////////////////////////////////////////////////////
+
+ // Include Files
+#include "Mpeg2Bits.h"
+
+
+
+//
+// Basic Type Aliases
+//
+
+typedef WORD PID;
+typedef BYTE TID;
+typedef UINT ClientKey;
+
+
+
+//
+// MPEG-2 Current/Next bit field
+//
+
+typedef enum
+{
+ MPEG_SECTION_IS_NEXT = 0,
+ MPEG_SECTION_IS_CURRENT = 1
+} MPEG_CURRENT_NEXT_BIT;
+
+
+
+//
+// MPEG-2 TID Extension structure
+//
+
+typedef struct
+{
+ WORD wTidExt;
+ WORD wCount;
+} TID_EXTENSION, *PTID_EXTENSION;
+
+
+
+//
+// MPEG-2 packet "small" header structure
+//
+
+typedef struct
+{
+ TID TableId;
+ union
+ {
+ MPEG_HEADER_BITS_MIDL S;
+ WORD W;
+ } Header;
+ BYTE SectionData[1]; // Array size is Header.S.SectionLength
+} SECTION, *PSECTION;
+
+
+
+//
+// MPEG-2 packet "long" header structure
+//
+
+typedef struct
+{
+ TID TableId;
+ union
+ {
+ MPEG_HEADER_BITS_MIDL S;
+ WORD W;
+ } Header;
+ WORD TableIdExtension;
+ union
+ {
+ MPEG_HEADER_VERSION_BITS_MIDL S;
+ BYTE B;
+ } Version;
+ BYTE SectionNumber;
+ BYTE LastSectionNumber;
+ BYTE RemainingData[1]; // Array size is Header.S.SectionLength - 5
+} LONG_SECTION, *PLONG_SECTION;
+
+
+
+//
+// DSM-CC packet header structure
+//
+
+typedef struct
+{
+ TID TableId;
+ union
+ {
+ MPEG_HEADER_BITS_MIDL S;
+ WORD W;
+ } Header;
+ WORD TableIdExtension;
+ union
+ {
+ MPEG_HEADER_VERSION_BITS_MIDL S;
+ BYTE B;
+ } Version;
+ BYTE SectionNumber;
+ BYTE LastSectionNumber;
+ BYTE ProtocolDiscriminator;
+ BYTE DsmccType;
+ WORD MessageId;
+ DWORD TransactionId;
+ BYTE Reserved;
+ BYTE AdaptationLength;
+ WORD MessageLength;
+ BYTE RemainingData[1];
+} DSMCC_SECTION, *PDSMCC_SECTION;
+
+
+
+//
+// MPEG-2 request/response packets structures
+//
+
+typedef struct
+{
+ DWORD dwLength;
+ PSECTION pSection;
+} MPEG_RQST_PACKET, *PMPEG_RQST_PACKET;
+
+typedef struct
+{
+ WORD wPacketCount;
+ PMPEG_RQST_PACKET PacketList[1]; // Array size is wPacketCount;
+} MPEG_PACKET_LIST, *PMPEG_PACKET_LIST;
+
+
+
+//
+// DSM-CC request filter options
+//
+
+typedef struct
+{
+ BOOL fSpecifyProtocol; // If true, Protocol should be set to desired value
+ BYTE Protocol;
+ BOOL fSpecifyType; // If true, Type should be set to desired value
+ BYTE Type;
+ BOOL fSpecifyMessageId; // If true, MessageId should be set to desired value
+ WORD MessageId;
+ BOOL fSpecifyTransactionId; // If true, TransactionId (or DownloadId for DDB msgs) should be set to desired value
+ BOOL fUseTrxIdMessageIdMask; // If false, TransactionId is filtered as is.
+ // If true, TransactionId is masked to look
+ // for any version of message with associated
+ // message identifier. See DVB - Data
+ // Broadcasting Guidlines 4.6.5. (Assignment
+ // and use of transactionId values).
+ DWORD TransactionId;
+ BOOL fSpecifyModuleVersion; // If true, ModuleVersion should be set to the desired value
+ BYTE ModuleVersion;
+ BOOL fSpecifyBlockNumber; // If true, BlockNumber should be set to desired value
+ WORD BlockNumber;
+ BOOL fGetModuleCall; // If true, NumberOfBlocksInModule should be set
+ WORD NumberOfBlocksInModule;
+} DSMCC_FILTER_OPTIONS;
+// 45 BYTES
+
+
+
+//
+// ATSC request filter options
+//
+
+typedef struct
+{
+ BOOL fSpecifyEtmId; // If true, EtmId should be set to desired value
+ DWORD EtmId;
+} ATSC_FILTER_OPTIONS;
+// 8 BYTES
+
+
+
+//
+// MPEG-2 request filter structure
+//
+
+typedef struct
+{
+ BYTE bVersionNumber; // Must be set to 1 or more to match filter definition
+ WORD wFilterSize; // Size of total filter structure. Version 1 filter is 73 bytes.
+ BOOL fUseRawFilteringBits; // If true, Filter and Mask fields should be set to desired value, all other
+ // fields with be ignored.
+ BYTE Filter[16]; // Bits with values to compare against for a match.
+ BYTE Mask[16]; // Bits set to 0 are bits that are compared to those in the filter, those
+ // bits set to 1 are ignored.
+ BOOL fSpecifyTableIdExtension; // If true, TableIdExtension should be set to desired value (false = don't care)
+ WORD TableIdExtension;
+ BOOL fSpecifyVersion; // If true, Version should be set to desired value (false = don't care)
+ BYTE Version;
+ BOOL fSpecifySectionNumber; // If true, SectionNumber should be set to desired value (false = don't care)
+ BYTE SectionNumber;
+ BOOL fSpecifyCurrentNext; // If true, fNext should be set to desired value (false = don't care)
+ BOOL fNext; // If true, next table is queried. Else, current
+ BOOL fSpecifyDsmccOptions; // If true, Dsmcc should be set with desired filter options
+ DSMCC_FILTER_OPTIONS Dsmcc;
+ BOOL fSpecifyAtscOptions; // If true, Atsc should be set with desired filter options
+ ATSC_FILTER_OPTIONS Atsc;
+} MPEG2_FILTER, *PMPEG2_FILTER;
+// 124 BYTES
+
+cpp_quote("#define MPEG2_FILTER_VERSION_1_SIZE 124")
+
+
+//
+// Mpeg-2 Stream buffer structure
+//
+
+typedef struct
+{
+ HRESULT hr;
+ DWORD dwDataBufferSize;
+ DWORD dwSizeOfDataRead;
+ BYTE * pDataBuffer;
+} MPEG_STREAM_BUFFER, *PMPEG_STREAM_BUFFER;
+
+
+
+//
+// MPEG-2 Time and Date structures
+//
+
+typedef struct
+{
+ BYTE Hours; // Legal Range: 0 to 23
+ BYTE Minutes; // Legal Range: 0 to 59
+ BYTE Seconds; // Legal Range: 0 to 59
+} MPEG_TIME;
+
+typedef MPEG_TIME MPEG_DURATION;
+
+typedef struct
+{
+ BYTE Date; // Legal Range: 1 to 31
+ BYTE Month; // Legal Range: 1 to 12
+ WORD Year; // Legal Range: 1900 to 2100
+} MPEG_DATE;
+
+typedef struct
+{
+ MPEG_DATE D;
+ MPEG_TIME T;
+} MPEG_DATE_AND_TIME;
+
+
+
+//
+// MPEG-2 API Context structures
+//
+
+typedef enum
+{
+ MPEG_CONTEXT_BCS_DEMUX,
+ MPEG_CONTEXT_WINSOCK
+} MPEG_CONTEXT_TYPE;
+
+typedef struct
+{
+ DWORD AVMGraphId;
+} MPEG_BCS_DEMUX;
+
+typedef struct
+{
+ DWORD AVMGraphId;
+} MPEG_WINSOCK;
+
+typedef struct
+{
+ MPEG_CONTEXT_TYPE Type;
+ union
+ {
+ MPEG_BCS_DEMUX Demux;
+ MPEG_WINSOCK Winsock;
+ } U;
+} MPEG_CONTEXT, *PMPEG_CONTEXT;
+
+
+
+//
+// MPEG-2 Service Request and Responses
+//
+
+typedef enum
+{
+ MPEG_RQST_UNKNOWN = 0,
+ MPEG_RQST_GET_SECTION,
+ MPEG_RQST_GET_SECTION_ASYNC,
+ MPEG_RQST_GET_TABLE,
+ MPEG_RQST_GET_TABLE_ASYNC,
+ MPEG_RQST_GET_SECTIONS_STREAM,
+ MPEG_RQST_GET_PES_STREAM,
+ MPEG_RQST_GET_TS_STREAM,
+ MPEG_RQST_START_MPE_STREAM,
+} MPEG_REQUEST_TYPE;
+
+typedef struct
+{
+ MPEG_REQUEST_TYPE Type;
+ MPEG_CONTEXT Context;
+ PID Pid;
+ TID TableId;
+ MPEG2_FILTER Filter;
+ DWORD Flags;
+} MPEG_SERVICE_REQUEST, *PMPEG_SERVICE_REQUEST;
+
+typedef struct
+{
+ DWORD IPAddress;
+ WORD Port;
+} MPEG_SERVICE_RESPONSE, *PMPEG_SERVICE_RESPONSE;
+
+
+
+//
+// DSM-CC & MPE Query Results
+//
+
+typedef struct _DSMCC_ELEMENT
+{
+ PID pid;
+ BYTE bComponentTag;
+ DWORD dwCarouselId;
+ DWORD dwTransactionId;
+ struct _DSMCC_ELEMENT * pNext;
+} DSMCC_ELEMENT, *PDSMCC_ELEMENT;
+
+typedef struct _MPE_ELEMENT
+{
+ PID pid;
+ BYTE bComponentTag;
+ struct _MPE_ELEMENT * pNext;
+} MPE_ELEMENT, *PMPE_ELEMENT;
+
+
+
+//
+// MPEG-2 Stream Filtering Structure
+//
+
+typedef struct _MPEG_STREAM_FILTER
+{
+ WORD wPidValue; // PID value
+ DWORD dwFilterSize; // size of filter in bits
+ BOOL fCrcEnabled; // enable/disable CRC check
+ BYTE rgchFilter[16]; // filter data
+ BYTE rgchMask[16]; // filter mask
+} MPEG_STREAM_FILTER;
diff --git a/dxsdk/Include/DShowIDL/Mstvca.idl b/dxsdk/Include/DShowIDL/Mstvca.idl
new file mode 100644
index 00000000..a9b257d8
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Mstvca.idl
@@ -0,0 +1,840 @@
+// MSTvCA.idl : IDL source for MSTvCA.dll
+//
+
+// This file will be processed by the MIDL tool to
+// produce the type library (CA.tlb) and marshalling code.
+
+import "oaidl.idl";
+import "ocidl.idl";
+#include "olectl.h"
+
+/* [
+ object,
+ dual,
+ uuid(49a32d3c-7d85-11d2-8895-00c04f794967),
+ helpstring("ITuneRequest Interface"),
+ pointer_default(unique)
+ ]
+ interface ITuneRequest : IDispatch
+ {
+ };
+*/
+import "tuner.idl"; // includes the whole BDA world! Yecko!
+
+ interface ICAManager;
+ interface ICARequest;
+ interface ICAPolicy;
+ interface ICAPolicies;
+ interface ICAPoliciesInternal;
+ interface ICAToll;
+ interface ICATolls;
+ interface ICATollsInternal;
+ interface ICADenial;
+ interface ICADenials;
+ interface ICAOffer;
+ interface ICAOffers;
+ interface ICAComponent;
+ interface ICAComponents;
+
+#define COLLECTID_Item 0
+#define COLLECTID_Count 1
+#define COLLECTID_Add 2
+#define COLLECTID_Remove 3
+#define COLLECTID_AddNew 4
+#define COLLECTID_CountDenied 5 // ICADenials
+#define COLLECTID_CountSelected 6 // ICADenials
+#define COLLECTID_PaySelectedTolls 7 // ICADenials
+
+typedef enum
+{
+ Unselected = 0,
+ Selected = 1
+} CATollState;
+
+typedef enum
+{
+ Denied = 0,
+ Transient = 1,
+// Allowed = 2,
+ DescriptionShort = 10, // one of the description fields changed
+ DescriptionLong = 11, // via a ICADenial::put_Description()
+ DescriptionHTML = 12, //
+ DescriptionXML = 13 // (keep these current+10 with list below...)
+} CADenialState;
+
+typedef enum
+{
+ Short = 0, // must be numeric, starting at 0. (Used as array index).
+ Long = 1, // in approximatly order of length in bytes
+ URL = 2,
+ HTML = 3,
+ XML = 4,
+ kDescEnd = 5 // invalid format, 1+ last real one (Used as array length).
+} CADescFormat;
+
+
+typedef enum
+{
+ Request = 1,
+ ComponentX = 2,
+ Offers = 4,
+ PaidTolls = 8,
+ Policies = 16,
+ Standard = 15, // all put the policies
+ All = 31 // all
+} CAUIDisplayFields;
+
+ // ---------------------------------------------------------------
+ // if add methods to ICAManagerInternal, be sure to add MAGICCALL in CAManagerProxy too..
+ // ---------------------------------------------------------------
+
+ [
+ object,
+ uuid(11166301-DF8A-463a-B620-7BEC23542010),
+ dual, // Helpers are Dual, IUnknown... so see from VB
+ hidden, restricted,
+ helpstring("ICAManagerInternal Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAManagerInternal : IUnknown
+ {
+ [ id(1), helpstring("method Save")] HRESULT Save();
+ [ id(2), helpstring("method Load")] HRESULT Load();
+ [propput, id(3), helpstring("property MarkDirty")] HRESULT MarkDirty([in] BOOL fDirty);
+ [propget, id(3), helpstring("property MarkDirty")] HRESULT MarkDirty([out, retval] BOOL *pfDirty);
+ [propput, id(4), helpstring("property TuneRequest")] HRESULT TuneRequest([in] ITuneRequest *ptunereq);
+ [ id(5), helpstring("method GetDefaultUI")] HRESULT GetDefaultUI([out] HWND *phwnd);
+ [ id(6), helpstring("method SetDefaultUI")] HRESULT SetDefaultUI([in] HWND hwnd);
+ // return the main CAManager object, not the proxy one.
+ [propget, id(7), helpstring("property CAManagerMain")] HRESULT CAManagerMain([out,retval] ICAManager **ppManagerMain);
+ [propput, id(8), helpstring("property BroadcastEventService")] HRESULT BroadcastEventService([in] IBroadcastEvent *pBroadcastEventService);
+ [propget, id(8), helpstring("property BroadcastEventService")] HRESULT BroadcastEventService([out, retval] IBroadcastEvent **ppBroadcastEventService);
+ [ id(9), helpstring("method DisplayDefaultUI")] HRESULT DisplayDefaultUI([in] VARIANT_BOOL fDisplay);
+ [ id(10), helpstring("method EnableDefaultUIPayTollsButton")] HRESULT EnableDefaultUIPayTollsButton([in] VARIANT_BOOL fEnabled);
+ [ id(11), helpstring("method UpdateDefaultUIForToll")] HRESULT UpdateDefaultUIForToll([in] ICAToll *pToll,[in] CATollState enState);
+ [propput, id(12), helpstring("property TuneRequestInt")] HRESULT TuneRequestInt([in] ITuneRequest *ptunereq);
+ [ id(13), helpstring("method AddDenialsFor")] HRESULT AddDenialsFor([in] IUnknown *pUnk); // see also ICAManager::get_DenialsFor()
+ [ id(14), helpstring("method RemoveDenialsFor")] HRESULT RemoveDenialsFor([in] IUnknown *pUnk);
+
+ [ id(2201),helpstring("method NotifyRequestActivated")] HRESULT NotifyRequestActivated([in] ICARequest *pReq);
+ [ id(2202),helpstring("method NotifyRequestDeactivated")] HRESULT NotifyRequestDeactivated([in] ICARequest *pReq);
+ [ id(2203),helpstring("method NotifyOfferAdded")] HRESULT NotifyOfferAdded([in] ICAOffer *pOffer,[in] long cOffers);
+ [ id(2204),helpstring("method NotifyOfferRemoved")] HRESULT NotifyOfferRemoved([in] ICAOffer *pOffer,[in] long cOffers);
+ [ id(2205),helpstring("method NotifyPolicyAdded")] HRESULT NotifyPolicyAdded([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [ id(2206),helpstring("method NotifyPolicyRemoved")] HRESULT NotifyPolicyRemoved([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [ id(2207),helpstring("method NotifyRequestDenialAdded")] HRESULT NotifyRequestDenialAdded([in] ICARequest *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2208),helpstring("method NotifyRequestDenialRemoved")] HRESULT NotifyRequestDenialRemoved([in] ICARequest *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2209),helpstring("method NotifyDenialTollAdded")] HRESULT NotifyDenialTollAdded([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2210),helpstring("method NotifyDenialTollRemoved")] HRESULT NotifyDenialTollRemoved([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2211),helpstring("method NotifyTollDenialAdded")] HRESULT NotifyTollDenialAdded([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2212),helpstring("method NotifyTollDenialRemoved")] HRESULT NotifyTollDenialRemoved([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2213),helpstring("method NotifyOfferTollAdded")] HRESULT NotifyOfferTollAdded([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2214),helpstring("method NotifyOfferTollRemoved")] HRESULT NotifyOfferTollRemoved([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2215),helpstring("method NotifyTollStateChanged")] HRESULT NotifyTollStateChanged([in] ICAToll *pToll, [in] CATollState enStateLast);
+ [ id(2216),helpstring("method NotifyDenialStateChanged")] HRESULT NotifyDenialStateChanged([in] ICADenial *pDenial, [in] CADenialState enStateLast);
+ [ id(2217),helpstring("method NotifyComponentDenialAdded")] HRESULT NotifyComponentDenialAdded([in] ICAComponent *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2218),helpstring("method NotifyComponentDenialRemoved")] HRESULT NotifyComponentDenialRemoved([in] ICAComponent *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+
+ };
+
+ [
+ object,
+ uuid(11166302-DF8A-463a-B620-7BEC23542010),
+ dual, // Helpers are Dual, IUnknown... so see from VB
+ hidden, restricted,
+ helpstring("ICAManagerXProxy Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAManagerXProxy : IUnknown
+ {
+ [propget, id(1), helpstring("property PunkCAManagerProxy")] HRESULT PunkCAManagerProxy([out,retval] IUnknown **ppUnkCAManagerProxy);
+ [ id(2201),helpstring("method NotifyRequestActivated_XProxy")] HRESULT NotifyRequestActivated_XProxy([in] ICARequest *pReq);
+ [ id(2202),helpstring("method NotifyRequestDeactivated_XProxy")] HRESULT NotifyRequestDeactivated_XProxy([in] ICARequest *pReq);
+ [ id(2203),helpstring("method NotifyOfferAdded_XProxy")] HRESULT NotifyOfferAdded_XProxy([in] ICAOffer *pOffer,[in] long cOffers);
+ [ id(2204),helpstring("method NotifyOfferRemoved_XProxy")] HRESULT NotifyOfferRemoved_XProxy([in] ICAOffer *pOffer,[in] long cOffers);
+ [ id(2205),helpstring("method NotifyPolicyAdded_XProxy")] HRESULT NotifyPolicyAdded_XProxy([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [ id(2206),helpstring("method NotifyPolicyRemoved_XProxy")] HRESULT NotifyPolicyRemoved_XProxy([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [ id(2207),helpstring("method NotifyRequestDenialAdded_XProxy")] HRESULT NotifyRequestDenialAdded_XProxy([in] ICARequest *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2208),helpstring("method NotifyRequestDenialRemoved_XProxy")] HRESULT NotifyRequestDenialRemoved_XProxy([in] ICARequest *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2209),helpstring("method NotifyDenialTollAdded_XProxy")] HRESULT NotifyDenialTollAdded_XProxy([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2210),helpstring("method NotifyDenialTollRemoved_XProxy")] HRESULT NotifyDenialTollRemoved_XProxy([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2211),helpstring("method NotifyTollDenialAdded_XProxy")] HRESULT NotifyTollDenialAdded_XProxy([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2212),helpstring("method NotifyTollDenialRemoved_XProxy")] HRESULT NotifyTollDenialRemoved_XProxy([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2213),helpstring("method NotifyOfferTollAdded_XProxy")] HRESULT NotifyOfferTollAdded_XProxy([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2214),helpstring("method NotifyOfferTollRemoved_XProxy")] HRESULT NotifyOfferTollRemoved_XProxy([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2215),helpstring("method NotifyTollStateChanged_XProxy")] HRESULT NotifyTollStateChanged_XProxy([in] ICAToll *pToll, [in] CATollState enStateLast);
+ [ id(2216),helpstring("method NotifyDenialStateChanged_XProxy")] HRESULT NotifyDenialStateChanged_XProxy([in] ICADenial *pDenial, [in] CADenialState enStateLast);
+ [ id(2217),helpstring("method NotifyComponentDenialAdded_XProxy")] HRESULT NotifyComponentDenialAdded_XProxy([in] ICAComponent *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2218),helpstring("method NotifyComponentDenialRemoved_XProxy")] HRESULT NotifyComponentDenialRemoved_XProxy([in] ICAComponent *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ };
+
+ // ---------------------------------------------------------------
+
+
+ // ---------------------------------------------------------------
+
+ [
+ object,
+ uuid(11166420-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAPolicies Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAPolicies : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval] IUnknown **ppCollection);
+ [propget, id(COLLECTID_Count)] HRESULT Count([out, retval] long *Count);
+ [propget, id(COLLECTID_Item)] HRESULT Item([in] VARIANT Index, [out, retval] ICAPolicy **ppPolicy);
+ [ id(COLLECTID_Add)] HRESULT Add([in] ICAPolicy *pPolicy);
+ [ id(COLLECTID_Remove)] HRESULT Remove([in] VARIANT Index);
+ };
+
+ [ object,
+ uuid(11166421-DF8A-463a-B620-7BEC23542010),
+ dual,
+ hidden, restricted,
+ helpstring("ICAPoliciesInternal Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAPoliciesInternal : IUnknown
+ {
+ [id(1),helpstring("method SetCAManager")] HRESULT SetCAManager([in] ICAManager *pManager);
+ [id(2),helpstring("method CheckRequest")] HRESULT CheckRequest([in] ICARequest *pReq);
+ };
+
+ // ---------------------------------------------------------------
+
+ [
+ object,
+ uuid(11166430-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICATolls Interface"),
+ pointer_default(unique)
+ ]
+ interface ICATolls : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval] IUnknown **ppCollection);
+ [propget, id(COLLECTID_Count)] HRESULT Count([out, retval] long *Count);
+ [propget, id(COLLECTID_Item)] HRESULT Item([in] VARIANT Index, [out, retval] ICAToll **ppToll);
+ [ id(COLLECTID_Add)] HRESULT Add([in] ICAToll *pToll);
+ [ id(COLLECTID_Remove)] HRESULT Remove([in] VARIANT Index);
+ };
+
+ [
+ object,
+ uuid(11166431-DF8A-463a-B620-7BEC23542010),
+ dual,
+ hidden, restricted,
+ helpstring("ICATolls Internal Interface"),
+ pointer_default(unique)
+ ]
+ interface ICATollsInternal : IUnknown // workaround for not being able to get _ICAResDenialEvents to work
+ {
+ [ id(1),helpstring("method SetCAManager")] HRESULT SetCAManager([in] ICAManager *pManager);
+ [ id(2),helpstring("method GetCAManager")] HRESULT GetCAManager([out] ICAManager **ppManager);
+ [ id(3),helpstring("method SetMustPersist")] HRESULT SetMustPersist([in] BOOL fMustPersist);
+ [ id(4),helpstring("method Save")] HRESULT Save([in] IStorage *pstore,[in] BSTR bstrPrefix);
+ [ id(5),helpstring("method Load")] HRESULT Load([in] IStorage *pstore,[in] BSTR bstrPrefix);
+ [ id(6),helpstring("method NotifyStateChanged")] HRESULT NotifyStateChanged([in] ICAToll *pToll, [in] CATollState enStateFrom);
+ [ id(7),helpstring("method NotifyTollSelectionChanged")] HRESULT NotifyTollSelectionChanged([in] ICAToll *pToll, [in] BOOL fSelected);
+ };
+ // ---------------------------------------------------------------
+
+
+ [
+ object,
+ uuid(11166440-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICADenials Interface"),
+ pointer_default(unique)
+ ]
+ interface ICADenials : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval] IUnknown **ppCollection);
+ [propget, id(COLLECTID_Count) ] HRESULT Count([out, retval] long *Count);
+ [propget, id(COLLECTID_Item)] HRESULT Item([in] VARIANT Index, [out, retval] ICADenial **ppDenial);
+ [propget, id(COLLECTID_AddNew), helpstring("property AddNew")] HRESULT AddNew([in] ICAPolicy *ppolicy, [in] BSTR bstrShortDesc, [in] IUnknown *pUnkDeniedObject, [in] long enDenialState, [out, retval] ICADenial **ppDenial);
+ [ id(COLLECTID_Remove)] HRESULT Remove([in] VARIANT Index);
+ [propget, id(COLLECTID_CountDenied)] HRESULT CountDenied([out, retval] long *Count);
+ [propget, id(COLLECTID_CountSelected)] HRESULT CountSelected([out, retval] long *Count);
+ [ id(COLLECTID_PaySelectedTolls)] HRESULT PaySelectedTolls();
+ };
+
+ [
+ object,
+ uuid(11166441-DF8A-463a-B620-7BEC23542010),
+ dual,
+ hidden, restricted,
+ helpstring("ICADenialsInternal Interface"),
+ pointer_default(unique)
+ ]
+ interface ICADenialsInternal : IUnknown
+ {
+ [ id(1),helpstring("method SetCAManager")] HRESULT SetCAManager([in] ICAManager *pManager);
+ [ id(2),helpstring("method NotifyDenialStateChanged")] HRESULT NotifyDenialStateChanged([in] ICADenial *pDenial, [in] CADenialState enStateLast);
+ };
+
+
+ // ---------------------------------------------------------------
+
+ [
+ object,
+ uuid(11166450-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAOffers Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAOffers : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM) , restricted] HRESULT _NewEnum([out, retval] IUnknown **ppCollection);
+ [propget, id(COLLECTID_Count)] HRESULT Count([out, retval] long *Count);
+ [propget, id(COLLECTID_Item)] HRESULT Item([in] VARIANT Index, [out, retval] ICAOffer **ppOffer);
+ [propget, id(COLLECTID_AddNew), helpstring("property AddNew")] HRESULT AddNew([in] ICAPolicy *pPolicy, [in] BSTR bstrName, [in] DATE dateStart, [in] DATE dateEnd, [out, retval] ICAOffer **ppOffer);
+ [ id(COLLECTID_Remove)] HRESULT Remove([in] VARIANT Index);
+ };
+
+ [
+ object,
+ uuid(11166470-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAComponents Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAComponents : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM) , restricted] HRESULT _NewEnum([out, retval] IUnknown **ppCollection);
+ [propget, id(COLLECTID_Count)] HRESULT Count([out, retval] long *Count);
+ [propget, id(COLLECTID_Item)] HRESULT Item([in] VARIANT Index, [out, retval] ICAComponent **ppComponent);
+ // [ id(COLLECTID_Add)] HRESULT Add([in] ICAComponent *pComponent);
+ // [ id(COLLECTID_Remove)] HRESULT Remove([in] VARIANT Index);
+ };
+
+
+ [
+ object,
+ uuid(11166361-DF8A-463a-B620-7BEC23542010),
+ dual,
+ hidden,
+ helpstring("ICAComponentInternal Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAComponentInternal : IUnknown
+ {
+ [ id(1), helpstring("method RemoveAllDenials")] HRESULT RemoveAllDenials();
+ [propget, id(2), helpstring("property Description")] HRESULT Description([in] CADescFormat enFormat, [out, retval] BSTR *pbstrDescription);
+ };
+ // ---------------------------------------------------------------
+
+
+ [
+ object,
+ uuid(860A3FE2-DED1-40E2-896C-057681A8A1A8),
+ dual,
+ helpstring("ICADefaultDlg Interface"),
+ pointer_default(unique)
+ ]
+ interface ICADefaultDlg : IDispatch
+ {
+ [propput, id(DISPID_AUTOSIZE)]
+ HRESULT AutoSize([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_AUTOSIZE)]
+ HRESULT AutoSize([out,retval]VARIANT_BOOL* pbool);
+ [propput, id(DISPID_BACKCOLOR)]
+ HRESULT BackColor([in]OLE_COLOR clr);
+ [propget, id(DISPID_BACKCOLOR)]
+ HRESULT BackColor([out,retval]OLE_COLOR* pclr);
+ [propput, id(DISPID_BACKSTYLE)]
+ HRESULT BackStyle([in]long style);
+ [propget, id(DISPID_BACKSTYLE)]
+ HRESULT BackStyle([out,retval]long* pstyle);
+ [propput, id(DISPID_BORDERCOLOR)]
+ HRESULT BorderColor([in]OLE_COLOR clr);
+ [propget, id(DISPID_BORDERCOLOR)]
+ HRESULT BorderColor([out, retval]OLE_COLOR* pclr);
+ [propput, id(DISPID_BORDERSTYLE)]
+ HRESULT BorderStyle([in]long style);
+ [propget, id(DISPID_BORDERSTYLE)]
+ HRESULT BorderStyle([out, retval]long* pstyle);
+ [propput, id(DISPID_BORDERWIDTH)]
+ HRESULT BorderWidth([in]long width);
+ [propget, id(DISPID_BORDERWIDTH)]
+ HRESULT BorderWidth([out, retval]long* width);
+ [propput, id(DISPID_DRAWMODE)]
+ HRESULT DrawMode([in]long mode);
+ [propget, id(DISPID_DRAWMODE)]
+ HRESULT DrawMode([out, retval]long* pmode);
+ [propput, id(DISPID_DRAWSTYLE)]
+ HRESULT DrawStyle([in]long style);
+ [propget, id(DISPID_DRAWSTYLE)]
+ HRESULT DrawStyle([out, retval]long* pstyle);
+ [propput, id(DISPID_DRAWWIDTH)]
+ HRESULT DrawWidth([in]long width);
+ [propget, id(DISPID_DRAWWIDTH)]
+ HRESULT DrawWidth([out, retval]long* pwidth);
+ [propput, id(DISPID_FILLCOLOR)]
+ HRESULT FillColor([in]OLE_COLOR clr);
+ [propget, id(DISPID_FILLCOLOR)]
+ HRESULT FillColor([out, retval]OLE_COLOR* pclr);
+ [propput, id(DISPID_FILLSTYLE)]
+ HRESULT FillStyle([in]long style);
+ [propget, id(DISPID_FILLSTYLE)]
+ HRESULT FillStyle([out, retval]long* pstyle);
+ [propputref, id(DISPID_FONT)]
+ HRESULT Font([in]IFontDisp* pFont);
+ [propput, id(DISPID_FONT)]
+ HRESULT Font([in]IFontDisp* pFont);
+ [propget, id(DISPID_FONT)]
+ HRESULT Font([out, retval]IFontDisp** ppFont);
+ [propput, id(DISPID_FORECOLOR)]
+ HRESULT ForeColor([in]OLE_COLOR clr);
+ [propget, id(DISPID_FORECOLOR)]
+ HRESULT ForeColor([out,retval]OLE_COLOR* pclr);
+ [propput, id(DISPID_ENABLED)]
+ HRESULT Enabled([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_ENABLED)]
+ HRESULT Enabled([out,retval]VARIANT_BOOL* pbool);
+ [propget, id(DISPID_HWND)]
+ HRESULT Window([out, retval]LONG_PTR* phwnd); // was long* via the wizard, but doesn't compile Win64
+ [propput, id(DISPID_TABSTOP)]
+ HRESULT TabStop([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_TABSTOP)]
+ HRESULT TabStop([out, retval]VARIANT_BOOL* pbool);
+ [propput, id(DISPID_TEXT)]
+ HRESULT Text([in]BSTR strText);
+ [propget, id(DISPID_TEXT)]
+ HRESULT Text([out, retval]BSTR* pstrText);
+ [propput, id(DISPID_CAPTION)]
+ HRESULT Caption([in]BSTR strCaption);
+ [propget, id(DISPID_CAPTION)]
+ HRESULT Caption([out,retval]BSTR* pstrCaption);
+ [propput, id(DISPID_BORDERVISIBLE)]
+ HRESULT BorderVisible([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_BORDERVISIBLE)]
+ HRESULT BorderVisible([out, retval]VARIANT_BOOL* pbool);
+ [propput, id(DISPID_APPEARANCE)]
+ HRESULT Appearance([in]short appearance);
+ [propget, id(DISPID_APPEARANCE)]
+ HRESULT Appearance([out, retval]short* pappearance);
+ [propput, id(DISPID_MOUSEPOINTER)]
+ HRESULT MousePointer([in]long pointer);
+ [propget, id(DISPID_MOUSEPOINTER)]
+ HRESULT MousePointer([out, retval]long* ppointer);
+ [propputref, id(DISPID_MOUSEICON)]
+ HRESULT MouseIcon([in]IPictureDisp* pMouseIcon);
+ [propput, id(DISPID_MOUSEICON)]
+ HRESULT MouseIcon([in]IPictureDisp* pMouseIcon);
+ [propget, id(DISPID_MOUSEICON)]
+ HRESULT MouseIcon([out, retval]IPictureDisp** ppMouseIcon);
+ [propputref, id(DISPID_PICTURE)]
+ HRESULT Picture([in]IPictureDisp* pPicture);
+ [propput, id(DISPID_PICTURE)]
+ HRESULT Picture([in]IPictureDisp* pPicture);
+ [propget, id(DISPID_PICTURE)]
+ HRESULT Picture([out, retval]IPictureDisp** ppPicture);
+ [propput, id(DISPID_VALID)]
+ HRESULT Valid([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_VALID)]
+ HRESULT Valid([out, retval]VARIANT_BOOL* pbool);
+ };
+ // ---------------------------------------------------------------
+
+[
+ uuid(11166000-DF8A-463a-B620-7BEC23542010),
+ version(1.0),
+ helpstring("Microsoft TV CA Type Library")
+]
+library MSTvCALib
+{
+ importlib("stdole32.tlb");
+ importlib("stdole2.tlb");
+
+// ---------------------------------------------------
+// CAUTION - if Change events below, need to perform:
+// 1) compile the MIDL file to generate the typelib
+// 2) In VCC class view, <xxx>->Implement Connection Point (_ICA<xxx>Events)
+// to regenerate the CProxy_ICA<xxx>Events<> code.
+// Need to browse to objd\i386 directory and select MSTvCA.tlb
+// (The file MSTvCACP.h must be checked out.)
+// Where <xxx> is Denials, Manager, Offers, Policies, Request, and Tolls
+
+ [
+ uuid(11166298-DF8A-463A-B620-7BEC23542010),
+ helpstring("_ICAResDenialTreeEvents Interface")
+ ]
+ dispinterface _ICAResDenialTreeEvents
+ {
+ properties:
+ methods:
+ [id(1),helpstring("method PaidTollSelected")] HRESULT PaidTollSelected([in] ICAToll *pToll, [in] long fSelected);
+ };
+
+
+ [
+ uuid(11166200-DF8A-463A-B620-7BEC23542010),
+ helpstring("ICAManagerEvents Interface")
+ ]
+ dispinterface _ICAManagerEvents
+ {
+ properties:
+ methods:
+ [id(2201),helpstring("method RequestActivated")] HRESULT RequestActivated([in] ICARequest *pReq);
+ [id(2202),helpstring("method RequestDeactivated")] HRESULT RequestDeactivated([in] ICARequest *pReq);
+ [id(2203),helpstring("method OfferAdded")] HRESULT OfferAdded([in] ICAOffer *pOffer,[in] long cOffers);
+ [id(2204),helpstring("method OfferRemoved")] HRESULT OfferRemoved([in] ICAOffer *pOffer,[in] long cOffers);
+ [id(2205),helpstring("method PolicyAdded")] HRESULT PolicyAdded([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [id(2206),helpstring("method PolicyRemoved")] HRESULT PolicyRemoved([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [id(2207),helpstring("method RequestDenialAdded")] HRESULT RequestDenialAdded([in] ICARequest *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [id(2208),helpstring("method RequestDenialRemoved")] HRESULT RequestDenialRemoved([in] ICARequest *pReq, [in] ICADenial *pDenial,[in] long cDenials);
+ [id(2209),helpstring("method DenialTollAdded")] HRESULT DenialTollAdded([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [id(2210),helpstring("method DenialTollRemoved")] HRESULT DenialTollRemoved([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [id(2211),helpstring("method TollDenialAdded")] HRESULT TollDenialAdded([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [id(2212),helpstring("method TollDenialRemoved")] HRESULT TollDenialRemoved([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [id(2213),helpstring("method OfferTollAdded")] HRESULT OfferTollAdded([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [id(2214),helpstring("method OfferTollRemoved")] HRESULT OfferTollRemoved([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [id(2215),helpstring("method TollStateChanged")] HRESULT TollStateChanged([in] ICAToll *pToll, [in] CATollState enState);
+ [id(2216),helpstring("method DenialStateChanged")] HRESULT DenialStateChanged([in] ICADenial *pDenial, [in] CADenialState enState);
+ [id(2217),helpstring("method ComponentDenialAdded")] HRESULT ComponentDenialAdded([in] ICAComponent *pComp, [in] ICADenial *pDenial,[in] long cDenials);
+ [id(2218),helpstring("method ComponentDenialRemoved")] HRESULT ComponentDenialRemoved([in] ICAComponent *pComp, [in] ICADenial *pDenial,[in] long cDenials);
+ };
+
+ [
+ uuid(11166210-DF8A-463A-B620-7BEC23542010),
+ helpstring("ICARequestEvents Interface")
+ ]
+ dispinterface _ICARequestEvents
+ {
+ properties:
+ methods:
+ [id(1), helpstring("method CheckStarted")] HRESULT CheckStarted([in] ICARequest *pRequest);
+ [id(2), helpstring("method CheckComplete")] HRESULT CheckComplete([in] ICARequest *pRequest,[in] long cDenials);
+ };
+ [
+ uuid(11166220-DF8A-463A-B620-7BEC23542010),
+ helpstring("_ICAPoliciesEvents Interface")
+ ]
+ dispinterface _ICAPoliciesEvents
+ {
+ properties:
+ methods:
+ [id(1), helpstring("method ItemAdded")] HRESULT ItemAdded([in] ICAPolicy *pPolicy, long cPolicies);
+ [id(2), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] ICAPolicy *pPolicy, long cPolicies);
+ };
+
+ [
+ uuid(11166230-DF8A-463A-B620-7BEC23542010),
+ helpstring("ICATollsEvents Interface")
+ ]
+ dispinterface _ICATollsEvents
+ {
+ properties:
+ methods:
+ [id(1), helpstring("method ItemAdded")] HRESULT ItemAdded([in] ICAToll *pToll, [in] long cTolls);
+ [id(2), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] ICAToll *pToll, [in] long cTolls);
+ [id(3), helpstring("method StateChanged")] HRESULT StateChanged([in] ICAToll *pToll, [in] CATollState enStateFrom);
+ };
+
+
+ [
+ uuid(11166240-DF8A-463A-B620-7BEC23542010),
+ helpstring("ICADenialsEvents Interface")
+ ]
+ dispinterface _ICADenialsEvents
+ {
+ properties:
+ methods:
+ [id(1), helpstring("method ItemAdded")] HRESULT ItemAdded([in] ICADenial *pDenial, [in] long cDenials);
+ [id(2), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] ICADenial *pDenial, [in] long cDenials);
+ [id(3), helpstring("method StateChanged")] HRESULT StateChanged([in] ICADenial *pDenial, [in] CADenialState enStateFrom);
+ };
+
+ [
+ uuid(11166250-DF8A-463A-B620-7BEC23542010),
+ helpstring("ICAOffersEvents Interface")
+ ]
+ dispinterface _ICAOffersEvents
+ {
+ properties:
+ methods:
+ [id(1), helpstring("method ItemAdded")] HRESULT ItemAdded([in] ICAOffer *pOffer, [in] long cOffers);
+ [id(2), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] ICAOffer *pOffer, [in] long cOffers);
+ };
+
+ [
+ uuid(11166260-DF8A-463A-B620-7BEC23542010),
+ helpstring("_ICAComponentsEvents Interface")
+ ]
+ dispinterface _ICAComponentsEvents
+ {
+ properties:
+ methods:
+ [id(1), helpstring("method ItemAdded")] HRESULT ItemAdded([in] ICAComponent *pComponent, [in] long cComponent);
+ [id(2), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] ICAComponent *pComponent, [in] long cComponent);
+ }; // --------------------------------
+ [
+ object,
+ dual,
+ uuid(11166300-DF8A-463a-B620-7BEC23542010),
+ helpstring("ICAManager Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAManager : IDispatch
+ {
+ [propget, id(1), helpstring("property Policies")] HRESULT Policies([out, retval] ICAPolicies **ppPolicies);
+ [propget, id(2), helpstring("property ActiveRequest")] HRESULT ActiveRequest([out, retval] ICARequest **ppRequest);
+ [propget, id(3), helpstring("property Offers")] HRESULT Offers([out, retval] ICAOffers **ppOffers);
+ [propget, id(4), helpstring("property PaidTolls")] HRESULT PaidTolls([out, retval] ICATolls **ppTolls);
+ [propput, id(5), helpstring("property UseDefaultUI")] HRESULT UseDefaultUI([in] long fUseDefaultUI);
+ [propget, id(5), helpstring("property UseDefaultUI")] HRESULT UseDefaultUI([out, retval] long *pfUseDefaultUI);
+ [propget, id(6), helpstring("property DenialsFor")] HRESULT DenialsFor([in] IUnknown *pUnk, [out, retval] ICADenials **ppDenials);
+ };
+
+ [
+ object,
+ uuid(11166310-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICARequest Interface"),
+ pointer_default(unique)
+ ]
+ interface ICARequest : IDispatch
+ {
+ [propget, id(1), helpstring("property RequestedItem")] HRESULT RequestedItem([out, retval] IUnknown **ppTunereq);
+ [propget, id(2), helpstring("property CAManager")] HRESULT CAManager([out, retval] ICAManager **ppManager);
+ [propget, id(3), helpstring("property ScheduleEntry")] HRESULT ScheduleEntry([out, retval] IUnknown **ppUnkScheduleEntry); // IScheduleEntry?
+ [propget, id(4), helpstring("property Denials")] HRESULT Denials([out, retval] ICADenials **ppDenials);
+ [propget, id(5), helpstring("property Components")] HRESULT Components([out, retval] ICAComponents **pComponents);
+ [propget, id(6), helpstring("property Check")] HRESULT Check([out, retval] long *pcDenials);
+ [propget, id(7), helpstring("property ResolveDenials")] HRESULT ResolveDenials([out, retval] long *pcDenials);
+ [propget, id(8), helpstring("property CountDeniedComponents")] HRESULT CountDeniedComponents([out, retval] long *pcDeniedComponents);
+ };
+
+ [
+ object,
+ uuid(11166320-DF8A-463a-B620-7BEC23542010),
+ helpstring("ICAPolicy Interface"), // client written
+ pointer_default(unique)
+ ]
+ interface ICAPolicy : IUnknown // -- not IDispatch, let the client side implement that interface
+ {
+ [propget, id(0), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pbstr);
+ [ id(1), helpstring("method CheckRequest")] HRESULT CheckRequest([in] ICARequest *pReq);
+// [propget, id(2), helpstring("property CAManager")] HRESULT CAManager([out, retval] ICAManager **ppManager);
+ [propput, id(2), helpstring("property CAManager")] HRESULT CAManager([in] ICAManager *pManager);
+ [propget, id(3), helpstring("property OkToPersist")] HRESULT OkToPersist([out, retval] BOOL *pfOkToPersist);
+ [propget, id(4), helpstring("property OkToRemove")] HRESULT OkToRemove([out, retval] BOOL *pfOkToRemove);
+ [propget, id(5), helpstring("property OkToRemoveDenial")] HRESULT OkToRemoveDenial(ICADenial *pDenial, [out, retval] BOOL *pfOk);
+ [propget, id(6), helpstring("property OkToRemoveOffer")] HRESULT OkToRemoveOffer(ICAOffer *pOffer, [out, retval] BOOL *pfOk);
+ }
+
+ [
+ object,
+ uuid(11166330-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAToll Interface"), // also client written
+ pointer_default(unique)
+ ]
+ interface ICAToll : IUnknown // -- also not IDispatch - client side implements that interface
+ {
+// [propget, id(1), helpstring("property CAManager")] HRESULT CAManager([out, retval] ICAManager **ppManager);
+ [propput, id(1), helpstring("property CAManager")] HRESULT CAManager([in] ICAManager *pManager);
+ [ id(2), helpstring("method Select")] HRESULT Select([in] BOOL fSelect);
+ [ id(3), helpstring("method PayToll")] HRESULT PayToll();
+ [propget, id(4), helpstring("property Refundable")] HRESULT Refundable([out, retval] BOOL *pfRefundable);
+ [ id(5), helpstring("method RefundToll")] HRESULT RefundToll();
+ [propget, id(6), helpstring("property TolledObject")] HRESULT TolledObject([out, retval] IUnknown **ppUnkTolled);
+ [propget, id(7), helpstring("property Denials")] HRESULT Denials([out, retval] ICADenials **ppDenials);
+ [propget, id(8), helpstring("property Policy")] HRESULT Policy([out, retval] ICAPolicy **ppPolicy);
+ [propget, id(9), helpstring("property Description")] HRESULT Description([in] CADescFormat enFormat, [out, retval] BSTR *pbstr);
+ [propget, id(10),helpstring("property TimePaid")] HRESULT TimePaid([out, retval] DATE *pdtPaid);
+ [propget, id(11),helpstring("property State")] HRESULT State([out, retval] CATollState *penState);
+ };
+
+ [
+ object,
+ uuid(11166340-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICADenial Interface"),
+ pointer_default(unique)
+ ]
+ interface ICADenial : IDispatch
+ {
+ [propget, id(1), helpstring("property DeniedObject")] HRESULT DeniedObject([out, retval] IUnknown **ppUnkDenied);
+ [propget, id(2), helpstring("property Policy")] HRESULT Policy([out, retval] ICAPolicy **ppPolicy);
+ [propget, id(3), helpstring("property Description")] HRESULT Description([in] CADescFormat enFormat, [out, retval] BSTR *pbstr);
+ [propput, id(3), helpstring("property Description")] HRESULT Description([in] CADescFormat enFormat, [in] BSTR bstr);
+ [propget, id(4), helpstring("property State")] HRESULT State([out, retval] CADenialState *penState);
+ [propput, id(4), helpstring("property State")] HRESULT State([in] CADenialState enState);
+ [propget, id(5), helpstring("property Tolls")] HRESULT Tolls([out, retval] ICATolls **ppTolls);
+ [ id(6), helpstring("method NotifyTollStateChanged")] HRESULT NotifyTollStateChanged([in] ICAToll *pToll, [in] CATollState enStateFrom);
+ };
+
+ [
+ object,
+ uuid(11166350-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAOffer Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAOffer : IDispatch
+ {
+ [propget, id(1), helpstring("property CAManager")] HRESULT CAManager([out, retval] ICAManager **ppManager);
+ [propput, id(1), helpstring("property CAManager")] HRESULT CAManager([in] ICAManager *pManager);
+ [propget, id(2), helpstring("property Policy")] HRESULT Policy([out, retval] ICAPolicy **pppolicy);
+ [propget, id(3), helpstring("property Description")] HRESULT Description([in] CADescFormat enFormat, [out, retval] BSTR *pbstr);
+ [propput, id(3), helpstring("property Description")] HRESULT Description([in] CADescFormat enFormat, [in] BSTR bstr);
+ [propget, id(4), helpstring("property StartTime")] HRESULT StartTime([out, retval] DATE *pdtStart);
+ [propget, id(5), helpstring("property EndTime")] HRESULT EndTime([out, retval] DATE *pdtEnd);
+ [propget, id(6), helpstring("property Tolls")] HRESULT Tolls([out, retval] ICATolls **ppTolls);
+ [ id(7), helpstring("method NotifyTollStateChanged")] HRESULT NotifyTollStateChanged([in] ICAToll *pToll, [in] CATollState enStateFrom);
+ };
+
+ [
+ object,
+ uuid(11166360-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAComponent Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAComponent : IDispatch
+ {
+ [propget, id(1), helpstring("property Component")] HRESULT Component([out, retval] IComponent **ppComponent);
+ [propget, id(2), helpstring("property Denials")] HRESULT Denials([out, retval] ICADenials **ppDenials);
+ [propget, id(3), helpstring("property Request")] HRESULT Request([out, retval] ICARequest **ppComponent);
+ };
+
+ // --------------------------------
+
+ [
+ uuid(11166100-DF8A-463a-B620-7BEC23542010),
+ helpstring("CAManager Class")
+ ]
+ coclass CAManager
+ {
+ [default] interface ICAManager;
+ interface ICAManagerInternal;
+// interface ICAManagerXProxy; // this is the actual outgoing 'event' interface
+ [default, source] dispinterface _ICAManagerEvents;
+ };
+
+ [ // magic class used to avoid circular references through the CAManager.
+ hidden,
+ uuid(11166101-DF8A-463a-B620-7BEC23542010),
+ helpstring("CAManagerProxy Class")
+ ]
+ coclass CAManagerProxy
+ {
+ [default] interface ICAManager;
+ interface ICAManagerInternal;
+// [default, source] dispinterface _ICAManagerEvents; /// QUESTION ??? DO I want these just here, or in the true Manager, or both?
+ };
+
+ [
+ uuid(11166540-DF8A-463a-B620-7BEC23542010), // needed for user's tolls.
+ helpstring("CADenials Class")
+ ]
+ coclass CADenials
+ {
+ [default] interface ICADenials;
+ interface ICADenialsInternal;
+ [default, source] dispinterface _ICADenialsEvents;
+ };
+
+ // TODO - mark this as hidden...
+ [
+ uuid(11166550-DF8A-463a-B620-7BEC23542010),
+ helpstring("CAOffer Class")
+ ]
+ coclass CAOffer
+ {
+ [default] interface ICAOffer;
+ };
+
+
+/* [
+ uuid(11166999-DF8A-463a-B620-7BEC23542010),
+ helpstring("CATempEvent_TempBuilder Class - used so we can build events the first time")
+ ]
+ coclass CATempEvent_TempBuilder
+ {
+ [source] dispinterface _ICAResDenialTreeEvents;
+ [source] dispinterface _ICAManagerEvents;
+ [source] dispinterface _ICARequestEvents;
+ [source] dispinterface _ICATollsEvents;
+ [source] dispinterface _ICADenialsEvents;
+ [source] dispinterface _ICAPoliciesEvents;
+ [source] dispinterface _ICAOffersEvents;
+ [source] dispinterface _ICAComponentsEvents;
+ };
+*/
+ // -----------------------------------
+ [
+ object,
+ uuid(11166898-DF8A-463a-B620-7BEC23542010),
+ dual,
+ helpstring("ICAResDenialTree Interface"),
+ pointer_default(unique)
+ ]
+ interface ICAResDenialTree : IDispatch
+ {
+ [propget, id(1), helpstring("property CAManager")] HRESULT CAManager([out, retval] ICAManager **ppCAManager);
+ [propput, id(1), helpstring("property CAManager")] HRESULT CAManager([in] ICAManager *pCAManager);
+ [propget, id(2), helpstring("property DisplayFields")] HRESULT DisplayFields([out, retval] long *penFields); // fields to display in default ResDenial UI
+ [propput, id(2), helpstring("property DisplayFields")] HRESULT DisplayFields([in] long enFields); // fields to display in default ResDenial UI
+ [ id(3), helpstring("method UpdateView")] HRESULT UpdateView([in] IUnknown *pUnk); // if object is being viewed, updates it.
+ // ResDenial control listens to these incoming sink events sent by Manager ((_ICAManagerEvents).. ID's Must match
+ [ id(2201),helpstring("method NotifyRequestActivated")] HRESULT NotifyRequestActivated([in] ICARequest *preq);
+ [ id(2202),helpstring("method NotifyRequestDeactivated")] HRESULT NotifyRequestDeactivated([in] ICARequest *preq);
+ [ id(2203),helpstring("method NotifyOfferAdded")] HRESULT NotifyOfferAdded([in] ICAOffer *pOffer,[in] long cOffers);
+ [ id(2204),helpstring("method NotifyOfferRemoved")] HRESULT NotifyOfferRemoved([in] ICAOffer *pOffer,[in] long cOffers);
+ [ id(2205),helpstring("method NotifyPolicyAdded")] HRESULT NotifyPolicyAdded([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [ id(2206),helpstring("method NotifyPolicyRemoved")] HRESULT NotifyPolicyRemoved([in] ICAPolicy *pPolicy,[in] long cPolicies);
+ [ id(2207),helpstring("method NotifyRequestDenialAdded")] HRESULT NotifyRequestDenialAdded([in] ICARequest *preq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2208),helpstring("method NotifyRequestDenialRemoved")] HRESULT NotifyRequestDenialRemoved([in] ICARequest *preq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2209),helpstring("method NotifyDenialTollAdded")] HRESULT NotifyDenialTollAdded([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2210),helpstring("method NotifyDenialTollRemoved")] HRESULT NotifyDenialTollRemoved([in] ICADenial *pDenial, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2211),helpstring("method NotifyTollDenialAdded")] HRESULT NotifyTollDenialAdded([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2212),helpstring("method NotifyTollDenialRemoved")] HRESULT NotifyTollDenialRemoved([in] ICAToll *pToll, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2213),helpstring("method NotifyOfferTollAdded")] HRESULT NotifyOfferTollAdded([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2214),helpstring("method NotifyOfferTollRemoved")] HRESULT NotifyOfferTollRemoved([in] ICAOffer *pOffer, [in] ICAToll *pToll, [in] long cTolls);
+ [ id(2215),helpstring("method NotifyTollStateChanged")] HRESULT NotifyTollStateChanged([in] ICAToll *pToll, [in] CATollState enStateLast);
+ [ id(2216),helpstring("method NotifyDenialStateChanged")] HRESULT NotifyDenialStateChanged([in] ICADenial *pDenial, [in] CADenialState enStateLast);
+ [ id(2217),helpstring("method NotifyComponentDenialAdded")] HRESULT NotifyComponentDenialAdded([in] ICAComponent *preq, [in] ICADenial *pDenial,[in] long cDenials);
+ [ id(2218),helpstring("method NotifyComponentDenialRemoved")] HRESULT NotifyComponentDenialRemoved([in] ICAComponent *preq, [in] ICADenial *pDenial,[in] long cDenials);
+ };
+
+ [
+ uuid(11166998-DF8A-463a-B620-7BEC23542010),
+ helpstring("CA Default RequestDenial Control")
+ ]
+ coclass CAResDenialTree
+ {
+ [default] interface ICAResDenialTree;
+ [default, source] dispinterface _ICAResDenialTreeEvents;
+ };
+
+ // -----------------------------
+
+ [
+ uuid(11166991-DF8A-463a-B620-7BEC23542010),
+ helpstring("_ICADefaultDlgEvents Interface")
+ ]
+ dispinterface _ICADefaultDlgEvents
+ {
+ properties:
+ methods:
+ };
+
+ [
+ uuid(11166990-DF8A-463a-B620-7BEC23542010),
+ helpstring("CADefaultDlg Class")
+ ]
+ coclass CADefaultDlg
+ {
+ [default] interface ICADefaultDlg;
+ [default, source] dispinterface _ICADefaultDlgEvents;
+ };
+
+ // -------------------------------------
+ // Magic way to define the SID_ ...
+
+ cpp_quote("#define SID_CAManager CLSID_CAManager")
+};
diff --git a/dxsdk/Include/DShowIDL/Mstvgs.idl b/dxsdk/Include/DShowIDL/Mstvgs.idl
new file mode 100644
index 00000000..7ce83f13
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Mstvgs.idl
@@ -0,0 +1,837 @@
+// GuideStore.idl : IDL source for GuideStore.dll
+//
+
+// This file will be processed by the MIDL tool to
+// produce the type library (GuideStore.tlb) and marshalling code.
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+interface IObjects;
+interface IMetaProperties;
+interface IMetaProperty;
+interface IMetaPropertyCondition;
+interface IMetaPropertySet;
+interface IMetaPropertySets;
+interface IMetaPropertyType;
+interface IMetaPropertyTypes;
+
+interface IGuideStore;
+interface IService;
+interface IServices;
+interface IProgram;
+interface IPrograms;
+interface IScheduleEntry;
+interface IScheduleEntries;
+interface IChannel;
+interface IChannels;
+interface IChannelLineup;
+interface IChannelLineups;
+interface IGuideDataProvider;
+interface IGuideDataProviders;
+
+#define didAdd 10
+#define didAddAt 15
+#define didAddNew 20
+#define didAddNewAt 25
+#define didAnd 30
+#define didBeginTrans 35
+#define didChannelLineups 40
+#define didChannels 50
+#define didCommitTrans 55
+#define didCond 60
+#define didCopyrightDate 70
+#define didCount 80
+#define didDataEndTime 90
+#define didDefaultValue 100
+#define didDescription 110
+#define didEndTime 120
+#define didGuideDataProvider 135
+#define didGuideDataProviders 136
+#define didID 150
+#define didIdOf 155
+#define didIID 170
+#define didIsAnyDataAvailable 180
+#define didInit 190
+#if 0
+#define didItem DISPID_VALUE
+#else
+#define didItem 191
+#endif
+#define didItemAdded 195
+#define didItemChanged 196
+#define didItemRemoved 197
+#define didItemsByKey 198
+#define didItemsChanged 199
+#define didItemsInTimeRange 200
+#define didItemsWithCond 210
+#define didItemWithKey 215
+#define didItemsWithMetaProp 220
+#define didItemsWithMetaPropType 230
+#define didItemsWithService 240
+#define didItemsWithType 400
+#define didItemWithID 250
+#define didItemWithIID 260
+#define didItemWithName 270
+#define didItemWithMetaPropTypeLang 280
+#define didItemWithTypeProviderLang 285
+#define didItemWithProviderName 290
+#define didItemWithServiceAtTime 300
+#define didLanguage 310
+#define didLength 320
+#define didLookup 325
+#define didMax 330
+#define didMin 340
+#define didName 350
+#define didNew 360
+#define didNewCollection 370
+#define didNot 380
+#define didObjects 390
+#define didObjectTypes 410
+#define didOpen 420
+#define didOr 430
+#define didProgram 440
+#define didPrograms 450
+#define didRollbackTrans 455
+#define didMetaProperties 460
+#define didMetaPropertiesOf 465
+#define didMetaPropertySet 470
+#define didMetaPropertySets 480
+#define didMetaPropertyType 490
+#define didMetaPropertyTypes 500
+#define didProviderDescription 510
+#define didProviderName 520
+#define didProviderNetworkName 530
+#define didResync 535
+#define didItemInvRelBy 540
+#define didItemsInvRelBy 545
+#define didItemsInvRelToBy 546
+#define didItemRelBy 550
+#define didItemsRelBy 555
+#define didItemsRelToBy 556
+#define didRemove 560
+#define didRemoveAll 565
+#define didSchedEntries 570
+#define didService 580
+#define didServices 590
+#define didStartTime 600
+#define didTitle 620
+#define didType 630
+#define didTuneRequest 640
+#define didUnreferencedItems 650
+#if 0
+#define didValue DISPID_VALUE
+#else
+#define didValue 660
+#endif
+
+
+[
+ uuid(8D9EEDCE-21E9-4845-82A8-99CEC53E6DB2),
+ version(1.0),
+ helpstring("Microsoft TV GuideStore 1.0 Type Library")
+]
+library MSTVGS
+{
+ importlib("stdole2.tlb");
+ [
+ object,
+ uuid(F71020D2-A467-4EB7-839A-63C8F40C7AB4),
+ dual,
+ helpstring("IMetaPropertySet Interface"),
+ pointer_default(unique)
+ ]
+ interface IMetaPropertySet : IDispatch
+ {
+ [propget, id(didName), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);
+ [propget, id(didMetaPropertyTypes), helpstring("property MetaPropertyTypes")] HRESULT MetaPropertyTypes([out, retval] IMetaPropertyTypes* *pVal);
+ };
+ [
+ object,
+ uuid(E8FD768C-EC4E-4DAB-A09C-011E8ECAE4D2),
+ dual,
+ helpstring("IMetaPropertySets Interface"),
+ pointer_default(unique),
+ nonextensible
+ ]
+ interface IMetaPropertySets : IDispatch
+ {
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT index, [out, retval] IMetaPropertySet* *ppropset);
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItemWithName), helpstring("property ItemWithName")] HRESULT ItemWithName(BSTR bstrName, [out, retval] IMetaPropertySet* *ppropset);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew(BSTR bstrName, [out, retval] IMetaPropertySet **pppropset);
+ [propget, id(didLookup), helpstring("property Lookup")] HRESULT Lookup([in] BSTR bstr, [out, retval] IMetaPropertyType * *ppproptype);
+ };
+ [
+ object,
+ uuid(86502400-213B-4ADF-A1E2-76365E7172BD),
+ dual,
+ helpstring("IMetaPropertyType Interface"),
+ pointer_default(unique)
+ ]
+ interface IMetaPropertyType : IDispatch
+ {
+ [propget, id(didMetaPropertySet), helpstring("property MetaPropertySet")] HRESULT MetaPropertySet([out, retval] IMetaPropertySet* *ppropset);
+ [propget, id(didID), helpstring("property ID")] HRESULT ID([out, retval] long *pVal);
+ [propget, id(didName), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);
+ [propget, id(didNew), helpstring("property New")] HRESULT New(long lang, VARIANT val, [out, retval] IMetaProperty* *pprop);
+ [propget, id(didCond), helpstring("property Cond")] HRESULT Cond(BSTR bstrCond, long lang, VARIANT varValue, [out, retval] IMetaPropertyCondition* *ppropcond);
+ };
+ [
+ object,
+ uuid(9BF4984A-4CFE-4588-9FCF-828C74EF7104),
+ dual,
+ helpstring("IMetaPropertyTypes Interface"),
+ pointer_default(unique)
+ ]
+ interface IMetaPropertyTypes : IDispatch
+ {
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT index, [out, retval] IMetaPropertyType* *pproptype);
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItemWithID), helpstring("property ItemWithID")] HRESULT ItemWithID(long id, [out, retval] IMetaPropertyType* *pproptype);
+ [propget, id(didItemWithName), helpstring("property ItemWithName")] HRESULT ItemWithName(BSTR bstrName, [out, retval] IMetaPropertyType* *pproptype);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew(long id, BSTR bstrName, [out, retval] IMetaPropertyType * *pVal);
+ [propget, id(didMetaPropertySet), helpstring("property MetaPropertySet")] HRESULT MetaPropertySet([out, retval] IMetaPropertySet * *pVal);
+ };
+ [
+ object,
+ uuid(A4BBD2C0-D7E4-4FC2-8FB0-176DDBCB3D72),
+ dual,
+ helpstring("IMetaProperty Interface"),
+ pointer_default(unique)
+ ]
+ interface IMetaProperty : IDispatch
+ {
+ [propget, id(didMetaPropertyType), helpstring("property MetaPropertyType")] HRESULT MetaPropertyType([out, retval] IMetaPropertyType* *pproptype);
+ [propget, id(didLanguage), helpstring("property Language")] HRESULT Language([out, retval] long *pVal);
+ [propget, id(didGuideDataProvider), helpstring("property GuideDataProvider")] HRESULT GuideDataProvider([out, retval] IGuideDataProvider **ppprovider);
+ [propget, id(didValue), helpstring("property Value")] HRESULT Value([out, retval] VARIANT *pvarValue);
+ [propput, id(didValue), helpstring("property Value")] HRESULT Value([in] VARIANT varValue);
+ [propputref, id(didValue), helpstring("property Value")] HRESULT Value([in] IUnknown *punk);
+ [propget, id(didCond), helpstring("property Cond")] HRESULT Cond(BSTR bstrCond, [out, retval] IMetaPropertyCondition* *ppropcond);
+ };
+ [
+ object,
+ uuid(E7F78F69-8326-48A0-8E54-BBDCEE43BA70),
+ dual,
+ helpstring("IMetaProperties Interface"),
+ pointer_default(unique)
+ ]
+ interface IMetaProperties : IDispatch
+ {
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT index, [out, retval] IMetaProperty* *pprop);
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItemWithMetaPropTypeLang), helpstring("property ItemWith")] HRESULT ItemWith(IMetaPropertyType *ptype, long lang, [out, retval] IMetaProperty* *pprop);
+ [propget, id(didItemWithTypeProviderLang), helpstring("property ItemWithTypeProviderLang")] HRESULT ItemWithTypeProviderLang(IMetaPropertyType *ptype, IGuideDataProvider *pprovider, long lang, [out, retval] IMetaProperty* *pprop);
+ [propget, id(didItemsWithMetaPropType), helpstring("property ItemsWithMetaPropertyType")] HRESULT ItemsWithMetaPropertyType(IMetaPropertyType *ptype, [out, retval] IMetaProperties* *pprops);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew(IMetaPropertyType *pproptype, long lang, VARIANT varValue, [out, retval] IMetaProperty * *pVal);
+ [id(didAdd), helpstring("method Add")] HRESULT Add(IMetaProperty *pprop);
+ };
+ [
+ object,
+ uuid(98FAAEF5-397A-4372-93A3-FB3DA49B3EF1),
+ dual,
+ helpstring("IMetaPropertyCondition Interface"),
+ pointer_default(unique)
+ ]
+ interface IMetaPropertyCondition : IDispatch
+ {
+ [propget, id(didAnd), helpstring("property And")] HRESULT And(IMetaPropertyCondition *pcond2, [out, retval] IMetaPropertyCondition* *ppropcond);
+ [propget, id(didOr), helpstring("property Or")] HRESULT Or(IMetaPropertyCondition *pcond2, [out, retval] IMetaPropertyCondition* *ppropcond);
+ };
+ [
+ object,
+ uuid(E4A9F7DA-F38F-43D3-AB3B-7E9F9FB7A7C7),
+ dual,
+ helpstring("IGuideStore Interface"),
+ pointer_default(unique)
+ ]
+ interface IGuideStore : IDispatch
+ {
+ [propget, id(didIID), helpstring("property UUID")] HRESULT UUID([out, retval] BSTR *bstrUUID);
+ [propget, id(didServices), helpstring("property Services")] HRESULT Services([out, retval] IServices * *pVal);
+ [propget, id(didPrograms), helpstring("property Programs")] HRESULT Programs([out, retval] IPrograms * *pVal);
+ [propget, id(didSchedEntries), helpstring("property ScheduleEntries")] HRESULT ScheduleEntries([out, retval] IScheduleEntries * *pVal);
+ [propget, id(didGuideDataProviders), helpstring("property GuideDataProviders")] HRESULT GuideDataProviders([out, retval] IGuideDataProviders * *ppdataproviders);
+ [propget, id(didMetaPropertySets), helpstring("property MetaPropertySets")] HRESULT MetaPropertySets([out, retval] IMetaPropertySets **pppropsets);
+ [id(didOpen), helpstring("method Open")] HRESULT Open(BSTR bstrName);
+ [propget, id(didObjects), helpstring("property Objects")] HRESULT Objects([out, retval] IObjects * *ppobjs);
+ [propget, id(didChannels), helpstring("property Channels")] HRESULT Channels([out, retval] IChannels * *pVal);
+ [propget, id(didChannelLineups), helpstring("property ChannelLineups")] HRESULT ChannelLineups([out, retval] IChannelLineups * *pVal);
+ [propget, id(didGuideDataProvider), helpstring("property ActiveGuideDataProvider")] HRESULT ActiveGuideDataProvider([out, retval] IGuideDataProvider * *pVal);
+ [propputref, id(didGuideDataProvider), helpstring("property ActiveGuideDataProvider")] HRESULT ActiveGuideDataProvider([in] IGuideDataProvider * newVal);
+
+
+ [propget, id(didIdOf), helpstring("property IdOf")] HRESULT IdOf([in] IUnknown *punk, [out, retval] long *pVal);
+ [propget, id(didMetaPropertiesOf), helpstring("property MetaPropertiesOf")] HRESULT MetaPropertiesOf([in] IUnknown *punk, [out, retval] IMetaProperties **ppprops);
+
+ [id(didBeginTrans), helpstring("method BeginTrans")] HRESULT BeginTrans();
+ [id(didCommitTrans), helpstring("method CommitTrans")] HRESULT CommitTrans();
+ [id(didRollbackTrans), helpstring("method RollbackTrans")] HRESULT RollbackTrans();
+ };
+
+ [
+ uuid(E7267FA2-7EC0-4577-BE37-0BBF11028A56),
+ helpstring("MetaPropertySet Class")
+ ]
+ coclass MetaPropertySet
+ {
+ [default] interface IMetaPropertySet;
+ };
+ [
+ uuid(027D8BB9-B860-4B96-B498-7EA609F33250),
+ helpstring("MetaPropertySets Class")
+ ]
+ coclass MetaPropertySets
+ {
+ [default] interface IMetaPropertySets;
+ };
+ [
+ uuid(A09139F3-47ED-4492-A45E-F7F11B121F4F),
+ helpstring("MetaPropertyType Class")
+ ]
+ coclass MetaPropertyType
+ {
+ [default] interface IMetaPropertyType;
+ };
+ [
+ uuid(5F24A17F-1DDE-4F37-8B29-489229175C73),
+ helpstring("MetaPropertyTypes Class")
+ ]
+ coclass MetaPropertyTypes
+ {
+ [default] interface IMetaPropertyTypes;
+ };
+ [
+ uuid(A42A1FF3-BC43-4714-8B94-06103474372B),
+ helpstring("MetaProperty Class")
+ ]
+ coclass MetaProperty
+ {
+ [default] interface IMetaProperty;
+ };
+ [
+ uuid(78B8FA05-01B2-4B0A-B6E0-59FC6C0E7A5E),
+ helpstring("MetaProperties Class")
+ ]
+ coclass MetaProperties
+ {
+ [default] interface IMetaProperties;
+ };
+ [
+ uuid(3B575572-EC9F-447D-9554-17C6E92E8328),
+ helpstring("MetaPropertyCondition Class")
+ ]
+ coclass MetaPropertyCondition
+ {
+ [default] interface IMetaPropertyCondition;
+ };
+ [
+ object,
+ uuid(59745450-F0F4-4B3F-B49E-55664E425CF6),
+ dual,
+ helpstring("IService Interface"),
+ pointer_default(unique)
+ ]
+ interface IService : IDispatch
+ {
+ [propget, id(didTuneRequest), helpstring("property TuneRequest")] HRESULT TuneRequest([out, retval] IUnknown * *ppunk);
+ [propputref, id(didTuneRequest), helpstring("property TuneRequest")] HRESULT TuneRequest([in] IUnknown *punk);
+ [propget, id(didID), helpstring("property ID")] HRESULT ID([out, retval] long *pVal);
+ [propget, id(didStartTime), helpstring("property StartTime")] HRESULT StartTime([out, retval] DATE *pdt);
+ [propput, id(didStartTime), helpstring("property StartTime")] HRESULT StartTime([in] DATE dt);
+ [propget, id(didEndTime), helpstring("property EndTime")] HRESULT EndTime([out, retval] DATE *pdt);
+ [propput, id(didEndTime), helpstring("property EndTime")] HRESULT EndTime([in] DATE dt);
+ [propget, id(didProviderName), helpstring("property ProviderName")] HRESULT ProviderName([out, retval] BSTR *pbstrName);
+ [propput, id(didProviderName), helpstring("property ProviderName")] HRESULT ProviderName([in] BSTR bstrName);
+ [propget, id(didProviderNetworkName), helpstring("property ProviderNetworkName")] HRESULT ProviderNetworkName([out, retval] BSTR *pbstrName);
+ [propput, id(didProviderNetworkName), helpstring("property ProviderNetworkName")] HRESULT ProviderNetworkName([in] BSTR bstrName);
+ [propget, id(didProviderDescription), helpstring("property ProviderDescription")] HRESULT ProviderDescription([out, retval] BSTR *pbstrDesc);
+ [propput, id(didProviderDescription), helpstring("property ProviderDescription")] HRESULT ProviderDescription([in] BSTR bstrDescr);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ [propget, id(didSchedEntries), helpstring("property ScheduleEntries")] HRESULT ScheduleEntries([out, retval] IScheduleEntries * *pVal);
+ };
+ [
+ object,
+ uuid(D3517044-B747-42C0-AFD5-31265ABA4977),
+ dual,
+ helpstring("IServices Interface"),
+ pointer_default(unique)
+ ]
+ interface IServices : IDispatch
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IService * *pVal);
+ [propget, id(didChannelLineups), helpstring("property ChannelLineups")] HRESULT ChannelLineups([out, retval] IChannelLineups * *pVal);
+ [id(didRemove), helpstring("method Remove")] HRESULT Remove(VARIANT varIndex);
+ [propget, id(didItemWithID), helpstring("property ItemWithID")] HRESULT ItemWithID(long id, [out, retval] IService * *pVal);
+ [propget, id(didItemWithProviderName), helpstring("property ItemWithProviderName")] HRESULT ItemWithProviderName(BSTR bstrProviderName, [out, retval] IService * *pVal);
+ [propget, id(didItemsWithMetaProp), helpstring("property ItemsWithMetaProperty")] HRESULT ItemsWithMetaProperty(IMetaProperty *pprop, [out, retval] IServices * *ppservices);
+ [propget, id(didItemsWithCond), helpstring("property ItemsWithMetaPropertyCond")] HRESULT ItemsWithMetaPropertyCond(IMetaPropertyCondition *pcond, [out, retval] IServices * *ppservices);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew(IUnknown *punkTuneRequest, BSTR bstrProviderName, BSTR bstrProviderDescription, BSTR bstrProviderNetworkName, DATE dtStart, DATE dtEnd, [out, retval] IService * *pVal);
+ [propget, id(didItemsInTimeRange), helpstring("property ItemsInTimeRange")] HRESULT ItemsInTimeRange(DATE dtStart, DATE dtEnd, [out, retval] IServices * *pVal);
+ [id(didRemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [id(didUnreferencedItems), helpstring("method UnreferencedItems")] HRESULT UnreferencedItems([out, retval] IServices **ppservices);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IServices * *ppservices);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IService * *ppservice);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+
+ [
+ uuid(C4001F96-2DEE-4C33-B807-F829889A8CCD),
+ helpstring("GuideStore Class")
+ ]
+ coclass GuideStore
+ {
+ [default] interface IGuideStore;
+ };
+ [
+ uuid(957D8D57-32B1-4BE3-8E37-EC8849F16815),
+ helpstring("Service Class")
+ ]
+ coclass Service
+ {
+ [default] interface IService;
+ };
+ [
+ uuid(CCFB9EC5-E28E-4DE1-BD07-1C79303DE0A0),
+ helpstring("IServicesEvents Interface")
+ ]
+ dispinterface IServicesEvents
+ {
+ properties:
+ methods:
+ [id(didItemAdded), helpstring("method ItemAdded")] HRESULT ItemAdded(IService *pservice);
+ [id(didItemRemoved), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method ItemChanged")] HRESULT ItemChanged(IService *pservice);
+ [id(didItemsChanged), helpstring("method ItemsChanged")] HRESULT ItemsChanged();
+ };
+ [
+ object,
+ uuid(FC91783E-5703-4319-A5B1-19555059559C),
+ dual,
+ helpstring("IProgram Interface"),
+ pointer_default(unique)
+ ]
+ interface IProgram : IDispatch
+ {
+ [propget, id(didID), helpstring("property ID")] HRESULT ID([out, retval] long *pVal);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ [propget, id(didSchedEntries), helpstring("property ScheduleEntries")] HRESULT ScheduleEntries([out, retval] IScheduleEntries * *pVal);
+ [propget, id(didTitle), helpstring("property Title")] HRESULT Title([out, retval] BSTR *pVal);
+ [propput, id(didTitle), helpstring("property Title")] HRESULT Title([in] BSTR newVal);
+ [propget, id(didDescription), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal);
+ [propput, id(didDescription), helpstring("property Description")] HRESULT Description([in] BSTR newVal);
+ [propget, id(didCopyrightDate), helpstring("property CopyrightDate")] HRESULT CopyrightDate([out, retval] DATE *pVal);
+ [propput, id(didCopyrightDate), helpstring("property CopyrightDate")] HRESULT CopyrightDate([in] DATE newVal);
+ };
+ [
+ object,
+ uuid(8786250A-8EF8-4A51-B80A-643CCF835DB6),
+ dual,
+ helpstring("IPrograms Interface"),
+ pointer_default(unique)
+ ]
+ interface IPrograms : IDispatch
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IProgram * *pVal);
+ [propget, id(didItemWithID), helpstring("property ItemWithID")] HRESULT ItemWithID(long id, [out, retval] IProgram * *pVal);
+ [propget, id(didItemsWithMetaProp), helpstring("property ItemsWithMetaProperty")] HRESULT ItemsWithMetaProperty(IMetaProperty *pprop, [out, retval] IPrograms * *pVal);
+ [propget, id(didItemsWithCond), helpstring("property ItemsWithMetaPropertyCond")] HRESULT ItemsWithMetaPropertyCond(IMetaPropertyCondition *pcond, [out, retval] IPrograms * *pVal);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew([out, retval] IProgram * *ppprog);
+ [id(didUnreferencedItems), helpstring("method UnreferencedItems")] HRESULT UnreferencedItems([out, retval] IPrograms **ppprogs);
+ [id(didRemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [id(didRemove), helpstring("method Remove")] HRESULT Remove(VARIANT varIndex);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IPrograms * *ppprogs);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IProgram * *ppprog);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+
+ [
+ uuid(43F457D2-C955-48E2-91AD-B91C9154C613),
+ helpstring("Services Class")
+ ]
+ coclass Services
+ {
+ [default] interface IServices;
+ [default, source] dispinterface IServicesEvents;
+ };
+ [
+ uuid(C51F670A-7D1A-494E-931D-886BFDB2B438),
+ helpstring("Program Class")
+ ]
+ coclass Program
+ {
+ [default] interface IProgram;
+ };
+ [
+ uuid(9AB9E463-1EC4-4D6B-AC80-5238561918EE),
+ helpstring("IProgramsEvents Interface")
+ ]
+ dispinterface IProgramsEvents
+ {
+ properties:
+ methods:
+ [id(didItemAdded), helpstring("method ItemAdded")] HRESULT ItemAdded(IProgram *pprog);
+ [id(didItemRemoved), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method ItemChanged")] HRESULT ItemChanged(IProgram *pprog);
+ [id(didItemsChanged), helpstring("method ItemsChanged")] HRESULT ItemsChanged();
+ };
+ [
+ object,
+ uuid(6C46F789-2156-4AF0-97D7-38D99E2C9160),
+ dual,
+ helpstring("IScheduleEntry Interface"),
+ pointer_default(unique)
+ ]
+ interface IScheduleEntry : IDispatch
+ {
+ [propget, id(didID), helpstring("property ID")] HRESULT ID([out, retval] long *pVal);
+ [propget, id(didService), helpstring("property Service")] HRESULT Service([out, retval] IService * *ppservice);
+ [propputref, id(didService), helpstring("property Service")] HRESULT Service([in] IService * pservice);
+ [propget, id(didProgram), helpstring("property Program")] HRESULT Program([out, retval] IProgram * *ppprog);
+ [propputref, id(didProgram), helpstring("property Program")] HRESULT Program([in] IProgram * pprog);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ [propget, id(didStartTime), helpstring("property StartTime")] HRESULT StartTime([out, retval] DATE *pdt);
+ [propput, id(didStartTime), helpstring("property StartTime")] HRESULT StartTime([in] DATE dt);
+ [propget, id(didEndTime), helpstring("property EndTime")] HRESULT EndTime([out, retval] DATE *pdt);
+ [propput, id(didEndTime), helpstring("property EndTime")] HRESULT EndTime([in] DATE dt);
+ [propget, id(didLength), helpstring("property Length")] HRESULT Length([out, retval] long *pVal);
+ };
+ [
+ object,
+ uuid(E5FDD9C4-8E60-4BEB-BBC8-93BE39C75BAA),
+ dual,
+ helpstring("IScheduleEntries Interface"),
+ pointer_default(unique)
+ ]
+ interface IScheduleEntries : IDispatch
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IScheduleEntry * *pVal);
+ [propget, id(didItemWithServiceAtTime), helpstring("property ItemWithServiceAtTime")] HRESULT ItemWithServiceAtTime(IService *pservice, DATE dt, [out, retval] IScheduleEntry * *pVal);
+ [propget, id(didItemsWithService), helpstring("property ItemsWithService")] HRESULT ItemsWithService(IService *pservice, [out, retval] IScheduleEntries **ppschedentries);
+ [propget, id(didItemsWithMetaProp), helpstring("property ItemsWithMetaProperty")] HRESULT ItemsWithMetaProperty(IMetaProperty *pprop, [out, retval] IScheduleEntries * *pVal);
+ [propget, id(didItemsWithCond), helpstring("property ItemsWithMetaPropertyCond")] HRESULT ItemsWithMetaPropertyCond(IMetaPropertyCondition *pcond, [out, retval] IScheduleEntries * *pVal);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew(DATE dtStart, DATE dtEnd, IService *pservice, IProgram *pprog, [out, retval] IScheduleEntry * *pVal);
+ [id(didRemove), helpstring("method Remove")] HRESULT Remove(VARIANT varIndex);
+ [id(didRemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [propget, id(didItemsInTimeRange), helpstring("property ItemsInTimeRange")] HRESULT ItemsInTimeRange(DATE dtStart, DATE dtEnd, [out, retval] IScheduleEntries * *pVal);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IScheduleEntries * *ppschedentries);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IScheduleEntry * *ppschedentry);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+
+ [
+ uuid(16C9C579-B3F4-4C94-88EC-A65EA0B839E7),
+ helpstring("Programs Class")
+ ]
+ coclass Programs
+ {
+ [default] interface IPrograms;
+ [default, source] dispinterface IProgramsEvents;
+ };
+ [
+ uuid(AFEBCA90-0FF9-48BD-BC98-95477A631BBB),
+ helpstring("ScheduleEntry Class")
+ ]
+ coclass ScheduleEntry
+ {
+ [default] interface IScheduleEntry;
+ };
+ [
+ uuid(32692A48-F4B5-4826-BE88-E7F8ED9E65DC),
+ helpstring("IScheduleEntriesEvents Interface")
+ ]
+ dispinterface IScheduleEntriesEvents
+ {
+ properties:
+ methods:
+ [id(didItemAdded), helpstring("method ItemAdded")] HRESULT ItemAdded(IScheduleEntry *pschedentry);
+ [id(didItemRemoved), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method ItemChanged")] HRESULT ItemChanged(IScheduleEntry *pschedentry);
+ [id(didItemsChanged), helpstring("method ItemsChanged")] HRESULT ItemsChanged();
+ };
+ [
+ object,
+ uuid(ED7DF8CD-4861-4389-8149-8EDE63A51F38),
+ dual,
+ helpstring("IChannel Interface"),
+ pointer_default(unique)
+ ]
+ interface IChannel : IDispatch
+ {
+ [propget, id(didName), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);
+ [propput, id(didName), helpstring("property Name")] HRESULT Name([in] BSTR newVal);
+ [propget, id(didService), helpstring("property Service")] HRESULT Service([out, retval] IService * *ppservice);
+ [propputref, id(didService), helpstring("property Service")] HRESULT Service([in] IService *pservice);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ [propget, id(didChannelLineups), helpstring("property ChannelLineups")] HRESULT ChannelLineups([out, retval] IChannelLineups * *pVal);
+ };
+
+ [
+ uuid(226D6AD0-7026-494F-BCAD-FAB087E67290),
+ helpstring("ScheduleEntries Class")
+ ]
+ coclass ScheduleEntries
+ {
+ [default] interface IScheduleEntries;
+ [default, source] dispinterface IScheduleEntriesEvents;
+ };
+ [
+ object,
+ uuid(3BAE53BD-70F0-4C7B-8C9E-E0317FFF8D79),
+ dual,
+ helpstring("IChannels Interface"),
+ pointer_default(unique)
+ ]
+ interface IChannels : IDispatch
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IChannel * *pVal);
+ [id(didAddAt), helpstring("method AddAt")] HRESULT AddAt(IChannel *pchan, long index);
+ [id(didRemove), helpstring("method Remove")] HRESULT Remove(VARIANT index);
+ [propget, id(didAddNewAt), helpstring("property AddNewAt")] HRESULT AddNewAt(IService *pservice, BSTR bstrName, long index, [out, retval] IChannel * *pVal);
+ [propget, id(didItemWithName), helpstring("property ItemWithName")] HRESULT ItemWithName(BSTR bstrName, [out, retval] IChannel **ppchan);
+ [propget, id(didItemsWithCond), helpstring("property ItemsWithMetaPropertyCond")] HRESULT ItemsWithMetaPropertyCond(IMetaPropertyCondition *pcond, [out, retval] IChannels * *ppchannels);
+ [id(didRemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [id(didUnreferencedItems), helpstring("method UnreferencedItems")] HRESULT UnreferencedItems([out, retval] IChannels **ppchans);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IChannels * *ppchans);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IChannel * *ppchan);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+
+ [
+ uuid(83568B75-1FCC-4853-957A-9CF617B350A3),
+ helpstring("Channel Class")
+ ]
+ coclass Channel
+ {
+ [default] interface IChannel;
+ };
+ [
+ uuid(6E945C62-0AB7-4D89-BB9E-212502FC7C88),
+ helpstring("IChannelsEvents Interface")
+ ]
+ dispinterface IChannelsEvents
+ {
+ properties:
+ methods:
+ [id(didItemAdded), helpstring("method ItemAdded")] HRESULT ItemAdded(IChannel *pchan);
+ [id(didItemRemoved), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method ItemChanged")] HRESULT ItemChanged(IChannel *pchan);
+ [id(didItemsChanged), helpstring("method ItemsChanged")] HRESULT ItemsChanged();
+ };
+ [
+ object,
+ uuid(AB3FF8DB-C718-4ABD-98DE-E14DC74F4872),
+ dual,
+ helpstring("IChannelLineup Interface"),
+ pointer_default(unique)
+ ]
+ interface IChannelLineup : IDispatch
+ {
+ [propget, id(didName), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);
+ [propput, id(didName), helpstring("property Name")] HRESULT Name([in] BSTR newVal);
+ [propget, id(didChannels), helpstring("property Channels")] HRESULT Channels([out, retval] IChannels * *pVal);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ };
+
+ [
+ uuid(73AF9077-4F6D-4FCB-A9E2-FDFBB9AE5310),
+ helpstring("Channels Class")
+ ]
+ coclass Channels
+ {
+ [default] interface IChannels;
+ [default, source] dispinterface IChannelsEvents;
+ };
+ [
+ object,
+ uuid(2F78C3E1-98FE-4526-A0A7-A621025AEFF6),
+ dual,
+ helpstring("IChannelLineups Interface"),
+ pointer_default(unique)
+ ]
+ interface IChannelLineups : IDispatch
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IChannelLineup **ppchanlineup);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew(BSTR bstrName, [out, retval] IChannelLineup * *pVal);
+ [id(didRemove), helpstring("method Remove")] HRESULT Remove(VARIANT varIndex);
+ [id(didRemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [id(didUnreferencedItems), helpstring("method UnreferencedItems")] HRESULT UnreferencedItems([out, retval] IChannelLineups **ppchanlineups);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IChannelLineups * *ppchanlineups);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IChannelLineup * *ppchanlineup);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+
+ [
+ uuid(8F86A876-E12A-4159-9647-EAFE0288014F),
+ helpstring("ChannelLineup Class")
+ ]
+ coclass ChannelLineup
+ {
+ [default] interface IChannelLineup;
+ };
+ [
+ uuid(1E3971E3-CCDC-445D-AE97-A15D5D4A40C9),
+ helpstring("IChannelLineupsEvents Interface")
+ ]
+ dispinterface IChannelLineupsEvents
+ {
+ properties:
+ methods:
+ [id(didItemAdded), helpstring("method ItemAdded")] HRESULT ItemAdded(IChannelLineup *pchanlineup);
+ [id(didItemRemoved), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method ItemChanged")] HRESULT ItemChanged(IChannelLineup *pchanlineup);
+ [id(didItemsChanged), helpstring("method ItemsChanged")] HRESULT ItemsChanged();
+ };
+ [
+ object,
+ uuid(A476A330-1123-4065-B3B7-D1EA899151BD),
+ helpstring("IObject Interface"),
+ pointer_default(unique)
+ ]
+ interface IObject : IUnknown
+ {
+ [propget, id(didID), helpstring("property ID")] HRESULT ID([out, retval] long *pVal);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ [propget, id(didItemRelBy), helpstring("property ItemRelatedBy")] HRESULT ItemRelatedBy([in] IMetaPropertyType *pproptype, [out, retval] IUnknown **ppobj);
+ [propputref, id(didItemRelBy), helpstring("property ItemRelatedBy")] HRESULT ItemRelatedBy([in] IMetaPropertyType *pproptype, [in] IUnknown *pobj);
+ [propget, id(didMetaPropertyType), helpstring("property MetaPropertyType")] HRESULT MetaPropertyType([in] BSTR bstr, [out, retval] IMetaPropertyType* *pproptype);
+ [propget, id(didItemsWithType), helpstring("property ObjectsWithType")] HRESULT ObjectsWithType([in] BSTR bstrCLSID, [out, retval] IObjects **ppobjs);
+ };
+ [
+ object,
+ uuid(E8F1FBD5-4E44-4C26-B3D2-2C1C6999D611),
+ helpstring("IObjects Interface"),
+ pointer_default(unique)
+ ]
+ interface IObjects : IUnknown
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IUnknown * *ppunk);
+ [propget, id(didItemsWithType), helpstring("property ItemsWithType")] HRESULT ItemsWithType(BSTR bstrCLSID, [out, retval] IObjects * *pVal);
+ [propget, id(didItemWithIID), helpstring("property ItemWithID")] HRESULT ItemWithID(long id, [out, retval] IUnknown * *ppunk);
+ [propget, id(didItemsWithMetaProp), helpstring("property ItemsWithMetaProperty")] HRESULT ItemsWithMetaProperty(IMetaProperty *pprop, [out, retval] IObjects * *pVal);
+ [propget, id(didItemsWithCond), helpstring("property ItemsWithMetaPropertyCond")] HRESULT ItemsWithMetaPropertyCond(IMetaPropertyCondition *ppropcond, [out, retval] IObjects * *pVal);
+ [id(didAddAt), helpstring("method AddAt")] HRESULT AddAt(IUnknown *punk, long index);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew([out, retval] IUnknown * *ppunk);
+ [id(didRemove), helpstring("method Remove")] HRESULT Remove(VARIANT varIndex);
+ [id(didRemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [propget, id(didAddNewAt), helpstring("property AddNewAt")] HRESULT AddNewAt([in] long index, [out, retval] IUnknown * *ppunk);
+ [propget, id(didItemsInTimeRange), helpstring("property ItemsInTimeRange")] HRESULT ItemsInTimeRange(DATE dtStart, DATE dtEnd, [out, retval] IObjects * *pVal);
+ [propget, id(didItemsRelToBy), helpstring("property ItemsRelatedToBy")] HRESULT ItemsRelatedToBy([in] IUnknown *pobj, [in] IMetaPropertyType *pproptype, [out, retval] IObjects * *ppobjs);
+ [propget, id(didItemsInvRelToBy), helpstring("property ItemsInverseRelatedToBy")] HRESULT ItemsInverseRelatedToBy([in] IUnknown *pobj, [in] IMetaPropertyType *pproptype, [out, retval] IObjects * *ppobjs);
+ [id(didUnreferencedItems), helpstring("method UnreferencedItems")] HRESULT UnreferencedItems([out, retval] IObjects **ppobjs);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IObjects * *pVal);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IUnknown * *ppunk);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+
+ [
+ uuid(8520EF80-1C19-4CB0-83FA-67DB59CC9AE4),
+ helpstring("ChannelLineups Class")
+ ]
+ coclass ChannelLineups
+ {
+ [default] interface IChannelLineups;
+ [default, source] dispinterface IChannelLineupsEvents;
+ };
+ [
+ uuid(83375A19-A098-42CF-9206-EE36FE48C637),
+ helpstring("IObjectsNotifications Interface")
+ ]
+ interface IObjectsNotifications : IUnknown
+ {
+ [id(didItemAdded), helpstring("method Notify_ItemAdded")] HRESULT Notify_ItemAdded(IUnknown *punk);
+ [id(didItemRemoved), helpstring("method Notify_ItemRemoved")] HRESULT Notify_ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method Notify_ItemChanged")] HRESULT Notify_ItemChanged(IUnknown *punk);
+ [id(didItemsChanged), helpstring("method Notify_ItemsChanged")] HRESULT Notify_ItemsChanged();
+ };
+
+ [
+ uuid(B485447D-B180-420F-B2A5-E7BBCEA07EAD),
+ aggregatable,
+ helpstring("Objects Class")
+ ]
+ coclass Objects
+ {
+ [default] interface IObjects;
+ };
+ [
+ object,
+ uuid(4B16049B-E548-4868-B303-D501340E2CB1),
+ dual,
+ helpstring("IGuideDataProvider Interface"),
+ pointer_default(unique)
+ ]
+ interface IGuideDataProvider : IDispatch
+ {
+ [propget, id(didID), helpstring("property ID")] HRESULT ID([out, retval] long *pVal);
+ [propget, id(didName), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pbstrName);
+ [propget, id(didDescription), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pbstrDesc);
+ [propput, id(didDescription), helpstring("property Description")] HRESULT Description([in] BSTR bstrDesc);
+ [propget, id(didMetaProperties), helpstring("property MetaProperties")] HRESULT MetaProperties([out, retval] IMetaProperties * *pVal);
+ };
+ [
+ object,
+ uuid(CA9DE996-637C-47BF-BC10-CF956BE298EC),
+ dual,
+ helpstring("IGuideDataProviders Interface"),
+ pointer_default(unique)
+ ]
+ interface IGuideDataProviders : IDispatch
+ {
+ [propget, id(didCount), helpstring("property Count")] HRESULT Count([out, retval] long *plCount);
+ [propget, id(didItem), helpstring("property Item")] HRESULT Item(VARIANT varIndex, [out, retval] IGuideDataProvider * *ppdataprovider);
+ [propget, id(didItemWithID), helpstring("property ItemWithID")] HRESULT ItemWithID(long id, [out, retval] IGuideDataProvider * *ppdataprovider);
+ [propget, id(didItemWithName), helpstring("property ItemWithName")] HRESULT ItemWithName(BSTR bstrName, [out, retval] IGuideDataProvider **ppdataprovider);
+ [propget, id(didItemsWithMetaProp), helpstring("property ItemsWithMetaProperty")] HRESULT ItemsWithMetaProperty(IMetaProperty *pprop, [out, retval] IGuideDataProviders * *ppdataproviders);
+ [propget, id(didItemsWithCond), helpstring("property ItemsWithMetaPropertyCond")] HRESULT ItemsWithMetaPropertyCond(IMetaPropertyCondition *pcond, [out, retval] IGuideDataProviders * *ppdataproviders);
+ [propget, id(didAddNew), helpstring("property AddNew")] HRESULT AddNew([in] BSTR bstrName, [out, retval] IGuideDataProvider * *ppdataprovider);
+
+ [propget, id(didItemsByKey), helpstring("property ItemsByKey")] HRESULT ItemsByKey([in] IMetaPropertyType *pproptype, [in] IGuideDataProvider *pprovider, [in] long idLang, [in] long vt, [out, retval] IGuideDataProviders * *ppproviders);
+ [propget, id(didItemWithKey), helpstring("property ItemWithKey")] HRESULT ItemWithKey(VARIANT varIndex, [out, retval] IGuideDataProvider * *ppprovider);
+ [id(didResync), helpstring("method Resync")] HRESULT Resync();
+ };
+ [
+ uuid(3CFC7A68-76E9-4F1D-8ECE-08C44F4FFC3E),
+ helpstring("GuideDataProvider Class")
+ ]
+ coclass GuideDataProvider
+ {
+ [default] interface IGuideDataProvider;
+ };
+ [
+ uuid(850A646E-140B-43B0-A243-20CC6B9FA8BC),
+ helpstring("IGuideDataProvidersEvents Interface")
+ ]
+ dispinterface IGuideDataProvidersEvents
+ {
+ properties:
+ methods:
+ [id(didItemAdded), helpstring("method ItemAdded")] HRESULT ItemAdded(IChannelLineup *pchanlineup);
+ [id(didItemRemoved), helpstring("method ItemRemoved")] HRESULT ItemRemoved([in] long idObj);
+ [id(didItemChanged), helpstring("method ItemChanged")] HRESULT ItemChanged(IChannelLineup *pchanlineup);
+ [id(didItemsChanged), helpstring("method ItemsChanged")] HRESULT ItemsChanged();
+ };
+
+ [
+ uuid(6E30077E-2E0B-4D4A-92B0-CDB5E5116E3B),
+ helpstring("GuideDataProviders Class")
+ ]
+ coclass GuideDataProviders
+ {
+ [default] interface IGuideDataProviders;
+ [default, source] dispinterface IGuideDataProvidersEvents;
+ };
+};
diff --git a/dxsdk/Include/DShowIDL/Msvidctl.idl b/dxsdk/Include/DShowIDL/Msvidctl.idl
new file mode 100644
index 00000000..d1a4d94e
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Msvidctl.idl
@@ -0,0 +1,715 @@
+// MSVidCtl.idl : IDL source for MSVidCtl.dll
+//
+
+// This file will be processed by the MIDL tool to
+// produce the type library (MSVidCtl.tlb) and marshalling code.
+
+
+// Copyright (c) Microsoft Corporation 1998-2000
+//
+
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Microsoft Windows")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2000.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("#pragma once")
+
+#include <olectl.h>
+#ifndef DO_NO_IMPORTS
+#ifndef TUNING_MODEL_ONLY
+import "mshtml.idl";
+import "segment.idl";
+#endif
+#endif
+
+#ifndef TUNING_MODEL_ONLY
+typedef enum {
+dispidInputs,
+dispidOutputs,
+dispid_Inputs,
+dispid_Outputs,
+dispidVideoRenderers,
+dispidAudioRenderers,
+dispidFeatures,
+dispidInput,
+dispidOutput,
+dispidVideoRenderer,
+dispidAudioRenderer,
+dispidSelectedFeatures,
+dispidView, // total graph control
+dispidBuild,
+dispidPause,
+dispidRun,
+dispidStop,
+dispidDecompose,
+dispidDisplaySize,
+dispidMaintainAspectRatio,
+dispidColorKey,
+dispidStateChange,
+dispidgetState,
+dispidunbind,
+dispidbind,
+dispidDisableVideo,
+dispidDisableAudio,
+dispidViewNext,
+dispidServiceP
+} MSViddispidList;
+
+typedef enum {
+ dslDefaultSize,
+ dslSourceSize = 0, // synonym
+ dslHalfSourceSize,
+ dslDoubleSourceSize,
+ dslFullScreen,
+ dslHalfScreen,
+ dslQuarterScreen,
+ dslSixteenthScreen
+} DisplaySizeList;
+
+typedef enum {
+ STATE_UNBUILT =-1,
+ STATE_STOP,
+ STATE_PAUSE,
+ STATE_PLAY,
+
+} MSVidCtlStateList;
+
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////
+//
+// the full Viewer control
+//
+///////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ uuid(B0EDF162-910A-11D2-B632-00C04F79498E),
+ dual,
+ hidden,
+ nonextensible,
+ helpstring("MS Video Control Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidCtl : IDispatch
+ {
+ // stock props
+ [propget, id(DISPID_AUTOSIZE)]
+ HRESULT AutoSize([out,retval]VARIANT_BOOL* pbool);
+ [propput, id(DISPID_AUTOSIZE)]
+ HRESULT AutoSize([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_BACKCOLOR)]
+ HRESULT BackColor([out,retval]OLE_COLOR* backcolor);
+ [propput, id(DISPID_BACKCOLOR)]
+ HRESULT BackColor([in]OLE_COLOR backcolor);
+ [propget, id(DISPID_ENABLED)]
+ HRESULT Enabled([out,retval]VARIANT_BOOL* pbool);
+ [propput, id(DISPID_ENABLED)]
+ HRESULT Enabled([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_TABSTOP)]
+ HRESULT TabStop([out, retval]VARIANT_BOOL* pbool);
+ [propput, id(DISPID_TABSTOP)]
+ HRESULT TabStop([in]VARIANT_BOOL vbool);
+ [propget, id(DISPID_HWND)]
+ HRESULT Window([out, retval]HWND* phwnd);
+ [id(DISPID_REFRESH)]
+ HRESULT Refresh();
+ // pseudo video renderer properties/methods that require access to ole container
+ [propget, id(dispidDisplaySize)]
+ HRESULT DisplaySize([out,retval]DisplaySizeList *CurrentValue);
+ [propput, id(dispidDisplaySize)]
+ HRESULT DisplaySize([in]DisplaySizeList NewValue);
+ [propget, id(dispidMaintainAspectRatio)]
+ HRESULT MaintainAspectRatio([out,retval]VARIANT_BOOL *CurrentValue);
+ [propput, id(dispidMaintainAspectRatio)]
+ HRESULT MaintainAspectRatio([in]VARIANT_BOOL NewValue);
+
+ // non-stock visual propertiies that require coordination/implementation with
+ // core ctl drawing/painting function
+ [propget, id(dispidColorKey)]
+ HRESULT ColorKey([out,retval]OLE_COLOR *CurrentValue);
+ [propput, id(dispidColorKey)]
+ HRESULT ColorKey([in]OLE_COLOR NewValue);
+
+
+
+ // availablee collection
+ [propget, id(dispidInputs), helpstring("Available Input Devices")] HRESULT InputsAvailable([in] BSTR CategoryGuid, [out, retval] IMSVidInputDevices * *pVal);
+ [propget, id(dispidOutputs), helpstring("Available Output Devices")] HRESULT OutputsAvailable([in] BSTR CategoryGuid, [out, retval] IMSVidOutputDevices * *pVal);
+ [propget, id(dispid_Inputs), hidden, restricted, helpstring("Available Input Devices")] HRESULT _InputsAvailable([in] LPCGUID CategoryGuid, [out, retval] IMSVidInputDevices * *pVal);
+ [propget, id(dispid_Outputs), hidden, restricted, helpstring("Available Output Devices")] HRESULT _OutputsAvailable([in] LPCGUID CategoryGuid, [out, retval] IMSVidOutputDevices * *pVal);
+ [propget, id(dispidVideoRenderers), helpstring("Available Video Renderers")] HRESULT VideoRenderersAvailable([out, retval] IMSVidVideoRendererDevices * *pVal);
+ [propget, id(dispidAudioRenderers), helpstring("Available Audio Renderers")] HRESULT AudioRenderersAvailable([out, retval] IMSVidAudioRendererDevices * *pVal);
+ [propget, id(dispidFeatures), helpstring("Available Features")] HRESULT FeaturesAvailable([out, retval] IMSVidFeatures * *pVal);
+ // current selections
+ [propget, id(dispidInput), helpstring("Currently Selected Input Device")] HRESULT InputActive([out, retval] IMSVidInputDevice **pVal);
+ [propput, id(dispidInput), helpstring("Currently Selected Input Device")] HRESULT InputActive([in] IMSVidInputDevice *pVal);
+ [propget, id(dispidOutput), helpstring("Currently Selected Output Devices")] HRESULT OutputsActive([out, retval] IMSVidOutputDevices **pVal);
+ [propput, id(dispidOutput), helpstring("Currently Selected Output Devices")] HRESULT OutputsActive([in] IMSVidOutputDevices *pVal);
+ [propget, id(dispidVideoRenderer), helpstring("Currently Selected Video Renderer")] HRESULT VideoRendererActive([out, retval] IMSVidVideoRenderer **pVal);
+ [propput, id(dispidVideoRenderer), helpstring("Currently Selected Video Renderer")] HRESULT VideoRendererActive([in] IMSVidVideoRenderer *pVal);
+ [propget, id(dispidAudioRenderer), helpstring("Currently Selected Audio Renderer")] HRESULT AudioRendererActive([out, retval] IMSVidAudioRenderer **pVal);
+ [propput, id(dispidAudioRenderer), helpstring("Currently Selected Audio Renderer")] HRESULT AudioRendererActive([in] IMSVidAudioRenderer *pVal);
+ [propget, id(dispidSelectedFeatures), helpstring("Currently Selected Features")] HRESULT FeaturesActive([out, retval] IMSVidFeatures **pVal);
+ [propput, id(dispidSelectedFeatures), helpstring("Currently Selected Features")] HRESULT FeaturesActive([in] IMSVidFeatures *pVal);
+ [propget, id(dispidgetState), helpstring("Check the current MSVidCtl state.")] HRESULT State([out, retval]MSVidCtlStateList* lState);
+ // methods
+
+ [id(dispidView), helpstring("Find an input device for viewing the specified item. This may be a string(VT_BSTR) or an object(VT_UNKNOWN).")] HRESULT View([in] VARIANT* v);
+ [id(dispidBuild), helpstring("Compose the graph")] HRESULT Build();
+ [id(dispidPause), helpstring("Stop the graph")] HRESULT Pause();
+ [id(dispidRun), helpstring("Compose the graph if necessary and start it running")] HRESULT Run();
+ [id(dispidStop), helpstring("Stop the graph")] HRESULT Stop();
+ [id(dispidDecompose), helpstring("Disassemble the graph(Inverse of Build)")] HRESULT Decompose();
+ [id(dispidDisableVideo), helpstring("set active video renderer to nothing")] HRESULT DisableVideo();
+ [id(dispidDisableAudio), helpstring("set active Audio renderer to nothing")] HRESULT DisableAudio();
+ [id(dispidViewNext), helpstring("Find another input device for viewing the specified item. Works like View except skips current input")] HRESULT ViewNext([in] VARIANT* v);
+ [propput, id(dispidServiceP), helpstring("Set Service Provider")] HRESULT ServiceProvider([in] IUnknown* pServiceP);
+ };
+
+ ///Added for the mseventbinder
+ [
+ object,
+ dual,
+ oleautomation,
+ hidden,
+ nonextensible,
+ pointer_default(unique),
+ uuid(C3A9F406-2222-436D-86D5-BA3229279EFB),
+ helpstring("IMSEventBinder Interface"),
+ ]
+ interface IMSEventBinder : IDispatch {
+ [id(dispidbind), helpstring("method Bind")] HRESULT Bind([in]LPDISPATCH pEventObject, [in]BSTR EventName, [in]BSTR EventHandler, [out, retval] LONG * CancelID);
+ [id(dispidunbind), helpstring("method Unbind")] HRESULT Unbind([in]DWORD CancelCookie);
+ };
+
+
+
+#endif // TUNING_MODEL_ONLY
+
+//*****************************************************************************
+//*****************************************************************************
+//////////////////////////////////////////////////////////////////////////////////////
+// Type Library for MS Video Control
+//////////////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+//*****************************************************************************
+
+
+[
+ uuid(B0EDF154-910A-11D2-B632-00C04F79498E),
+ version(1.0),
+ helpstring("MS Video Control 1.0 Type Library")
+]
+library MSVidCtlLib
+{
+ importlib("stdole2.tlb");
+
+
+#ifndef TUNING_MODEL_ONLY
+///////////////////////////////////////////////////////////////////////////////////////
+// event interfaces
+///////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ uuid(B0EDF164-910A-11D2-B632-00C04F79498E),
+ helpstring("MS Video Control Events Interface")
+ ]
+ dispinterface _IMSVidCtlEvents
+ {
+ properties:
+ // Event interface has no properties
+ methods:
+ [id(DISPID_CLICK)] void Click();
+ [id(DISPID_DBLCLICK)] void DblClick();
+ [id(DISPID_KEYDOWN)] void KeyDown(short* KeyCode, short Shift);
+ [id(DISPID_KEYPRESS)] void KeyPress(short* KeyAscii);
+ [id(DISPID_KEYUP)] void KeyUp(short* KeyCode, short Shift);
+ [id(DISPID_MOUSEDOWN)] void MouseDown(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
+ [id(DISPID_MOUSEMOVE)] void MouseMove(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
+ [id(DISPID_MOUSEUP)] void MouseUp(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
+ [id(DISPID_ERROREVENT)] void Error(short Number, BSTR* Description, long Scode, BSTR Source, BSTR HelpFile, long HelpContext, boolean* CancelDisplay);
+ [id(dispidStateChange)] void StateChange(MSVidCtlStateList PrevState, MSVidCtlStateList CurrState);
+ };
+
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////////////
+// device classes
+///////////////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+
+// inputs
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(1C15D484-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Control Analog TV Tuner Device Class")
+ ]
+ coclass MSVidAnalogTunerDevice
+ {
+ [default] interface IMSVidAnalogTuner;
+ [default, source] interface IMSVidAnalogTunerEvent;
+ interface IMSVidGraphSegment;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(A2E3074E-6C3D-11d3-B653-00C04F79498E),
+ helpstring("MS Video Control BDA Tuner Device Class")
+ ]
+ coclass MSVidBDATunerDevice
+ {
+ [default] interface IMSVidTuner;
+ [default, source] interface IMSVidTunerEvent;
+ interface IMSVidGraphSegment;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(37B0353C-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control File Playback Device Class")
+ ]
+ coclass MSVidFilePlaybackDevice
+ {
+ [default] interface IMSVidFilePlayback;
+ [default, source] interface IMSVidFilePlaybackEvent;
+ interface IMSVidGraphSegment;
+ };
+
+
+ [
+ uuid(011B3619-FE63-4814-8A84-15A194CE9CE3),
+ helpstring("MSVidWebDVD Class")
+ ]
+ coclass MSVidWebDVD
+ {
+ [default] interface IMSVidWebDVD;
+ [default, source] interface IMSVidWebDVDEvent;
+ interface IMSVidGraphSegment;
+ };
+
+ [
+ uuid(FA7C375B-66A7-4280-879D-FD459C84BB02),
+ helpstring("MSVidWebDVDAdm Class")
+ ]
+ coclass MSVidWebDVDAdm
+ {
+ [default] interface IMSVidWebDVDAdm;
+ };
+
+// rendererers
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(37B03543-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Video Renderer Class")
+ ]
+ coclass MSVidVideoRenderer
+ {
+ [default] interface IMSVidVideoRenderer2;
+ interface IMSVidVideoRenderer;
+ [default, source] interface IMSVidVideoRendererEvent;
+ //[default, source] interface IMSVidVideoRendererEvent2;
+ interface IMSVidGraphSegment;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(37B03544-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Audio Renderer Class")
+ ]
+ coclass MSVidAudioRenderer
+ {
+ [default] interface IMSVidAudioRenderer;
+ [default, source] interface IMSVidAudioRendererEvent;
+ interface IMSVidGraphSegment;
+ };
+
+// Stream Buffer Sink and Source and Playback
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(9E77AAC4-35E5-42a1-BDC2-8F3FF399847C),
+ helpstring("MS Video Control Stream Buffer Engine Sink Class")
+ ]
+ coclass MSVidStreamBufferSink
+ {
+ [default] interface IMSVidStreamBufferSink;
+ [default, source] interface IMSVidStreamBufferSinkEvent;
+ interface IMSVidGraphSegment;
+ };
+
+ //////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(AD8E510D-217F-409b-8076-29C5E73B98E8),
+ helpstring("MS Video Control Stream Buffer Engine Playback Device Class")
+ ]
+ coclass MSVidStreamBufferSource
+ {
+ [default] interface IMSVidStreamBufferSource;
+ [default, source] interface IMSVidStreamBufferSourceEvent;
+ interface IMSVidGraphSegment;
+ };
+
+// features
+
+ [
+ uuid(334125C0-77E5-11d3-B653-00C04F79498E),
+ helpstring("MS Video Control Standard Data Services for Broadcast IP through NDIS stack")
+ ]
+ coclass MSVidDataServices
+ {
+ interface IMSVidDataServices;
+ };
+
+ [
+ uuid(BB530C63-D9DF-4b49-9439-63453962E598),
+ helpstring("MS Video Control Encoder")
+ ]
+ coclass MSVidEncoder
+ {
+ interface IMSVidEncoder;
+ };
+
+ [
+ uuid(0149EEDF-D08F-4142-8D73-D23903D21E90),
+ helpstring("MS Video Control Encoder")
+ ]
+ coclass MSVidXDS
+ {
+ interface IMSVidXDS;
+ };
+
+ [
+ uuid(7F9CB14D-48E4-43b6-9346-1AEBC39C64D3),
+ helpstring("MS Video Control Standard Closed Captioning")
+ ]
+ coclass MSVidClosedCaptioning
+ {
+ [default] interface IMSVidClosedCaptioning2;
+ interface IMSVidClosedCaptioning;
+ };
+
+///////////////////////////////////////////////////////////////////////////////////////
+// control classes
+///////////////////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(B0EDF163-910A-11D2-B632-00C04F79498E),
+ control,
+ helpstring("MS Video Control Class")
+ ]
+ coclass MSVidCtl
+ {
+ [default] interface IMSVidCtl;
+ [default, source] dispinterface _IMSVidCtlEvents;
+ interface IMSVidGraphSegmentContainer;
+ };
+
+///////////////////////////////////////////////////////////////////////////////////////
+// device collections
+///////////////////////////////////////////////////////////////////////////////////////
+ [
+ uuid(C5702CCC-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Input Device Collection Class")
+ ]
+ coclass MSVidInputDevices
+ {
+ [default] interface IMSVidInputDevices;
+ };
+
+ [
+ uuid(C5702CCD-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Output Device Collection Class")
+ ]
+ coclass MSVidOutputDevices
+ {
+ [default] interface IMSVidOutputDevices;
+ };
+
+ [
+ uuid(C5702CCE-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Video Renderer Device Collection Class")
+ ]
+ coclass MSVidVideoRendererDevices
+ {
+ [default] interface IMSVidVideoRendererDevices;
+ };
+
+ [
+ uuid(C5702CCF-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Audio Renderer Device Collection Class")
+ ]
+ coclass MSVidAudioRendererDevices
+ {
+ [default] interface IMSVidAudioRendererDevices;
+ };
+
+ [
+ uuid(C5702CD0-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Feature Collection Class")
+ ]
+ coclass MSVidFeatures
+ {
+ [default] interface IMSVidFeatures;
+ };
+
+///////////////////////////////////////////////////////////////////////////////////////
+// composites
+///////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ uuid(2764BCE5-CC39-11D2-B639-00C04F79498E),
+ helpstring("MS Video Control Generic Composition Class")
+ ]
+ coclass MSVidGenericComposite
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(E18AF75A-08AF-11d3-B64A-00C04F79498E),
+ helpstring("MS Video Control Custom Composition for Analog Capture to Overlay Mixer")
+ ]
+ coclass MSVidAnalogCaptureToOverlayMixer
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(C5702CD6-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Custom Composition for Analog Capture to Data Services")
+ ]
+ coclass MSVidAnalogCaptureToDataServices
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+
+ [
+ uuid(267db0b3-55e3-4902-949b-df8f5cec0191),
+ helpstring("MS Video Control Custom Composition for WebDVD to Overlay Mixer")
+ ]
+ coclass MSVidWebDVDToVideoRenderer
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(8D04238E-9FD1-41c6-8DE3-9E1EE309E935),
+ helpstring("MS Video Control Custom Composition for WebDVD to Audio Renderer")
+ ]
+ coclass MSVidWebDVDToAudioRenderer
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(6AD28EE1-5002-4e71-AAF7-BD077907B1A4),
+ helpstring("MS Video Control Custom Composition for Mpeg2 Decoder to Closed Captioning")
+ ]
+ coclass MSVidMPEG2DecoderToClosedCaptioning
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(9F50E8B1-9530-4ddc-825E-1AF81D47AED6),
+ helpstring("MS Video Control Custom Composition for Analog Capture to Stream Buffer Sink")
+ ]
+ coclass MSVidAnalogCaptureToStreamBufferSink
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(ABE40035-27C3-4a2f-8153-6624471608AF),
+ helpstring("MS Video Control Custom Composition for Digital Capture to Stream Buffer Sink")
+ ]
+ coclass MSVidDigitalCaptureToStreamBufferSink
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+
+ [
+ uuid(38F03426-E83B-4e68-B65B-DCAE73304838),
+ helpstring("MS Video Control Custom Composition for Data Services to Stream Buffer Sink")
+ ]
+ coclass MSVidDataServicesToStreamBufferSink
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(0429EC6E-1144-4bed-B88B-2FB9899A4A3D),
+ helpstring("MS Video Control Custom Composition for DataServices To XDS")
+ ]
+ coclass MSVidDataServicesToXDS
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(A0B9B497-AFBC-45ad-A8A6-9B077C40D4F2),
+ helpstring("MS Video Control Custom Composition for Encoder to Stream Buffer Sink")
+ ]
+ coclass MSVidEncoderToStreamBufferSink
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(B401C5EB-8457-427f-84EA-A4D2363364B0),
+ helpstring("MS Video Control Custom Composition for File Playback to Video Renderer")
+ ]
+ coclass MSVidFilePlaybackToVideoRenderer
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(CC23F537-18D4-4ece-93BD-207A84726979),
+ helpstring("MS Video Control Custom Composition for File Playback to Audio Renderer")
+ ]
+ coclass MSVidFilePlaybackToAudioRenderer
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(28953661-0231-41db-8986-21FF4388EE9B),
+ helpstring("MS Video Control Custom Composition for TV Tuner to Encoder")
+ ]
+ coclass MSVidAnalogTVToEncoder
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(3C4708DC-B181-46a8-8DA8-4AB0371758CD),
+ helpstring("MS Video Control Custom Composition for SBE Source to Video renderer")
+ ]
+ coclass MSVidStreamBufferSourceToVideoRenderer
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(3540D440-5B1D-49cb-821A-E84B8CF065A7),
+ helpstring("MS Video Control Custom Composition for TV Tuner to XDS")
+ ]
+ coclass MSVidAnalogCaptureToXDS
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+ [
+ uuid(9193A8F9-0CBA-400e-AA97-EB4709164576),
+ helpstring("MS Video Control Custom Composition for Stream Buffer Source to CC")
+ ]
+ coclass MSVidSBESourceToCC
+ {
+ interface IMSVidCompositionSegment;
+ };
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+// Miscellaneous
+///////////////////////////////////////////////////////////////////////////////////////
+
+ // Events
+ [
+ uuid(577FAA18-4518-445E-8F70-1473F8CF4BA4),
+ helpstring("MSEventBinder Class")
+ ]
+ coclass MSEventBinder
+ {
+ [default] interface IMSEventBinder;
+ };
+
+ [
+ uuid(CAAFDD83-CEFC-4e3d-BA03-175F17A24F91),
+ helpstring("MSVidStreamBufferRecordingControl")
+ ]
+ coclass MSVidStreamBufferRecordingControl
+ {
+ [default] interface IMSVidStreamBufferRecordingControl;
+ };
+ // vidrect class
+ [
+ hidden, restricted,
+ uuid(CB4276E6-7D5F-4cf1-9727-629C5E6DB6AE),
+ helpstring("Automation compliant scalable rectangle Class")
+ ]
+ coclass MSVidRect
+ {
+ [default] interface IMSVidRect;
+ };
+
+ // NOTE: there is no object factory for the following classes.
+ // the implementation for the underlying code is a c++ abstract base class.
+ // this coclass is only provided here to force vb to expose the base interface
+ // to enable polymorphic access to derived objects
+ [
+ hidden, restricted,
+ uuid(6E40476F-9C49-4c3e-8BB9-8587958EFF74),
+ helpstring("dummy class to expose base interface to VB")
+ ]
+ coclass MSVidDevice
+ {
+ [default] interface IMSVidDevice;
+ };
+ [
+ hidden, restricted,
+ uuid(AC1972F2-138A-4ca3-90DA-AE51112EDA28),
+ helpstring("dummy class to expose base interface to VB")
+ ]
+ coclass MSVidInputDevice
+ {
+ [default] interface IMSVidInputDevice;
+ };
+ [
+ hidden, restricted,
+ uuid(95F4820B-BB3A-4e2d-BC64-5B817BC2C30E),
+ helpstring("dummy class to expose base interface to VB")
+ ]
+ coclass MSVidVideoInputDevice
+ {
+ [default] interface IMSVidVideoInputDevice;
+ };
+ [
+ hidden, restricted,
+ uuid(1990D634-1A5E-4071-A34A-53AAFFCE9F36),
+ helpstring("dummy class to expose base interface to VB")
+ ]
+ coclass MSVidVideoPlaybackDevice
+ {
+ [default] interface IMSVidPlayback;
+ };
+ [
+ hidden, restricted,
+ uuid(7748530B-C08A-47ea-B24C-BE8695FF405F),
+ helpstring("dummy class to expose base interface to VB")
+ ]
+ coclass MSVidFeature
+ {
+ [default] interface IMSVidFeature;
+ };
+ [
+ hidden, restricted,
+ uuid(87EB890D-03AD-4e9d-9866-376E5EC572ED),
+ helpstring("dummy class to expose base interface to VB")
+ ]
+ coclass MSVidOutput
+ {
+ [default] interface IMSVidOutputDevice;
+ };
+
+
+#endif //TUNING_MODEL_ONLY
+
+};
+
+// end of file msvidctl.idl
diff --git a/dxsdk/Include/DShowIDL/Segment.idl b/dxsdk/Include/DShowIDL/Segment.idl
new file mode 100644
index 00000000..a9895cbd
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Segment.idl
@@ -0,0 +1,1349 @@
+// Segment.idl : IDL source for devices segments for msvid.dll
+//
+
+// This file will be processed by the MIDL tool to
+// produce the type library (msvideo.tlb) and marshalling code.
+
+
+// Copyright (c) Microsoft Corporation 1998-2000
+//
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Microsoft Windows")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2000.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("#pragma once")
+
+#ifndef TUNING_MODEL_ONLY
+
+#include <olectl.h>
+cpp_quote("#include <olectl.h>")
+
+#ifndef DO_NO_IMPORTS
+import "oaidl.idl";
+import "ocidl.idl";
+import "strmif.idl";
+import "tuner.idl";
+import "tvratings.idl";
+#endif
+
+typedef enum {
+dispidName,
+dispidStatus,
+dispidDevImageSourceWidth,
+dispidDevImageSourceHeight,
+dispidDevCountryCode,
+dispidDevOverScan,
+dispidSegment,
+dispidDevVolume,
+dispidDevBalance,
+dispidDevPower,
+dispidTuneChan,
+dispidDevVideoSubchannel,
+dispidDevAudioSubchannel,
+dispidChannelAvailable,
+dispidDevVideoFrequency,
+dispidDevAudioFrequency,
+dispidCount,
+dispidDevFileName,
+dispidVisible,
+dispidOwner,
+dispidMessageDrain,
+//dispidPosition,
+dispidViewable,
+dispidDevView,
+dispidKSCat,
+dispidCLSID,
+dispid_KSCat,
+dispid_CLSID,
+dispidTune,
+dispidTS,
+dispidDevSAP,
+dispidClip,
+dispidRequestedClipRect,
+dispidClippedSourceRect,
+dispidAvailableSourceRect,
+dispidMediaPosition,
+dispidDevRun,
+dispidDevPause,
+dispidDevStop,
+dispidCCEnable,
+dispidDevStep,
+dispidDevCanStep,
+dispidSourceSize,
+dispid_playtitle,
+dispid_playchapterintitle,
+dispid_playchapter,
+dispid_playchaptersautostop,
+dispid_playattime,
+dispid_playattimeintitle,
+dispid_playperiodintitleautostop,
+dispid_replaychapter,
+dispid_playprevchapter,
+dispid_playnextchapter,
+dispid_playforwards,
+dispid_playbackwards,
+dispid_stilloff,
+dispid_audiolanguage,
+dispid_showmenu,
+dispid_resume,
+dispid_returnfromsubmenu,
+dispid_buttonsavailable,
+dispid_currentbutton,
+dispid_SelectAndActivateButton,
+dispid_ActivateButton,
+dispid_SelectRightButton,
+dispid_SelectLeftButton,
+dispid_SelectLowerButton,
+dispid_SelectUpperButton,
+dispid_ActivateAtPosition,
+dispid_SelectAtPosition,
+dispid_ButtonAtPosition,
+dispid_NumberOfChapters,
+dispid_TotalTitleTime,
+dispid_TitlesAvailable,
+dispid_VolumesAvailable,
+dispid_CurrentVolume,
+dispid_CurrentDiscSide,
+dispid_CurrentDomain,
+dispid_CurrentChapter,
+dispid_CurrentTitle,
+dispid_CurrentTime,
+dispid_FramesPerSecond,
+dispid_DVDTimeCode2bstr,
+dispid_DVDDirectory,
+dispid_IsSubpictureStreamEnabled,
+dispid_IsAudioStreamEnabled,
+dispid_CurrentSubpictureStream,
+dispid_SubpictureLanguage,
+dispid_CurrentAudioStream,
+dispid_AudioStreamsAvailable,
+dispid_AnglesAvailable,
+dispid_CurrentAngle,
+dispid_CCActive,
+dispid_CurrentCCService,
+dispid_SubpictureStreamsAvailable,
+dispid_SubpictureOn,
+dispid_DVDUniqueID,
+dispid_EnableResetOnStop,
+dispid_AcceptParentalLevelChange,
+dispid_NotifyParentalLevelChange,
+dispid_SelectParentalCountry,
+dispid_SelectParentalLevel,
+dispid_TitleParentalLevels,
+dispid_PlayerParentalCountry,
+dispid_PlayerParentalLevel,
+dispid_Eject,
+dispid_UOPValid,
+dispid_SPRM,
+dispid_GPRM,
+dispid_DVDTextStringType,
+dispid_DVDTextString,
+dispid_DVDTextNumberOfStrings,
+dispid_DVDTextNumberOfLanguages,
+dispid_DVDTextLanguageLCID,
+dispid_RegionChange,
+dispid_DVDAdm,
+dispid_DeleteBookmark,
+dispid_RestoreBookmark,
+dispid_SaveBookmark,
+dispid_SelectDefaultAudioLanguage,
+dispid_SelectDefaultSubpictureLanguage,
+dispid_PreferredSubpictureStream,
+dispid_DefaultMenuLanguage,
+dispid_DefaultSubpictureLanguage,
+dispid_DefaultAudioLanguage,
+dispid_DefaultSubpictureLanguageExt,
+dispid_DefaultAudioLanguageExt,
+dispid_LanguageFromLCID,
+dispid_KaraokeAudioPresentationMode,
+dispid_KaraokeChannelContent,
+dispid_KaraokeChannelAssignment,
+dispid_RestorePreferredSettings,
+dispid_ButtonRect,
+dispid_DVDScreenInMouseCoordinates,
+dispid_CustomCompositorClass,
+dispidCustomCompositorClass,
+dispid_CustomCompositor,
+dispidMixerBitmap,
+dispid_MixerBitmap,
+dispidMixerBitmapOpacity,
+dispidMixerBitmapRect,
+dispidSetupMixerBitmap,
+dispidUsingOverlay,
+dispidDisplayChange,
+dispidRePaint,
+dispid_IsEqualDevice,
+dispidrate,
+dispidposition,
+dispidpositionmode,
+dispidlength,
+dispidChangePassword,
+dispidSaveParentalLevel,
+dispidSaveParentalCountry,
+dispidConfirmPassword,
+dispidGetParentalLevel,
+dispidGetParentalCountry,
+dispidDefaultAudioLCID,
+dispidDefaultSubpictureLCID,
+dispidDefaultMenuLCID,
+dispidBookmarkOnStop,
+dispidMaxVidRect,
+dispidMinVidRect,
+dispidCapture,
+dispid_DecimateInput,
+dispidAlloctor,
+dispid_Allocator,
+dispidAllocPresentID,
+dispidSetAllocator,
+dispid_SetAllocator,
+dispidStreamBufferSinkName,
+dispidStreamBufferSourceName,
+dispidStreamBufferContentRecording,
+dispidStreamBufferReferenceRecording,
+dispidstarttime,
+dispidstoptime,
+dispidrecordingstopped,
+dispidrecordingstarted,
+dispidNameSetLock,
+dispidrecordingtype,
+dispidstart,
+dispidRecordingAttribute,
+dispid_RecordingAttribute,
+dispidSBEConfigure,
+dispid_CurrentRatings,
+dispid_MaxRatingsLevel,
+dispid_audioencoderint,
+dispid_videoencoderint,
+dispidService,
+dispid_BlockUnrated,
+dispid_UnratedDelay,
+dispid_SuppressEffects,
+dispidsbesource,
+LastReservedDeviceDispid=0x3fff
+} SegDispidList;
+typedef enum {
+eventidStateChange,
+eventidOnTuneChanged,
+eventidEndOfMedia,
+eventidDVDNotify,
+eventidPlayForwards,
+eventidPlayBackwards,
+eventidShowMenu,
+eventidResume,
+eventidSelectOrActivateButton,
+eventidStillOff,
+eventidPauseOn,
+eventidChangeCurrentAudioStream,
+eventidChangeCurrentSubpictureStream,
+eventidChangeCurrentAngle,
+eventidPlayAtTimeInTitle,
+eventidPlayAtTime,
+eventidPlayChapterInTitle,
+eventidPlayChapter,
+eventidReplayChapter,
+eventidPlayNextChapter,
+eventidStop,
+eventidReturnFromSubmenu,
+eventidPlayTitle,
+eventidPlayPrevChapter,
+eventidChangeKaraokePresMode,
+eventidChangeVideoPresMode,
+eventidOverlayUnavailable,
+eventidSinkCertificateFailure,
+eventidSinkCertificateSuccess,
+eventidSourceCertificateFailure,
+eventidSourceCertificateSuccess,
+eventidRatingsBlocked,
+eventidRatingsUnlocked,
+eventidRatingsChanged,
+eventidWriteFailure,
+eventidTimeHole,
+eventidStaleDataRead,
+eventidContentBecomingStale,
+eventidStaleFileDeleted,
+LastReservedDeviceEvent=0x3fff
+} SegEventidList;
+typedef enum {
+ FrameMode,
+ TenthsSecondsMode
+} PositionModeList;
+typedef enum {
+ CONTENT = 0,
+ REFERENCE
+} RecordingType;
+
+ typedef enum {
+ None,
+ Caption1,
+ Caption2,
+ Text1,
+ Text2,
+ XDS
+} MSVidCCService;
+
+//*****************************************************************************
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////
+//
+// interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+//*****************************************************************************
+
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////
+//
+// Utility Interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+
+interface IMSVidRect;
+
+[object,
+ uuid(7F5000A6-A440-47ca-8ACC-C0E75531A2C2),
+ helpstring("Automation Compliant GDI Rect with Automatic HWND Scaling"),
+ pointer_default(unique)
+]
+interface IMSVidRect : IDispatch {
+ [propget, helpstring("Rectangle Top")] HRESULT Top([out, retval] LONG* TopVal);
+ [propput, helpstring("Rectangle Top")] HRESULT Top([in] LONG TopVal);
+ [propget, helpstring("Rectangle Left")] HRESULT Left([out, retval] LONG* LeftVal);
+ [propput, helpstring("Rectangle Left")] HRESULT Left([in] LONG LeftVal);
+ [propget, helpstring("Rectangle Width")] HRESULT Width([out, retval] LONG* WidthVal);
+ [propput, helpstring("Rectangle Width")] HRESULT Width([in] LONG WidthVal);
+ [propget, helpstring("Rectangle Height")] HRESULT Height([out, retval] LONG* HeightVal);
+ [propput, helpstring("Rectangle Height")] HRESULT Height([in] LONG HeightVal);
+ [propget, helpstring("Coordinates relative to HWnd")] HRESULT HWnd([out, retval] HWND* HWndVal);
+ [propput, helpstring("Coordinates relative to HWnd")] HRESULT HWnd([in] HWND HWndVal);
+ [propput, helpstring("New Rectangle Values")] HRESULT Rect([in] IMSVidRect* RectVal);
+};
+
+interface IMSVidGraphSegmentContainer;
+interface IMSVidGraphSegment;
+interface IEnumMSVidGraphSegment;
+
+
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////
+//
+// Segment Container interface allowing segments to find and access other segments
+//
+///////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+ ///////////////////////////////////////////////////////////////////////////////////////
+ // if segments need to change the control state(stop, run, pause, etc) or get any stock
+ // properties that are also made available to clients such as HWND, then they should simply
+ // QI for the main IMSVidCtl interface. there's no reason to implement this stuff twice.
+ [object,
+ uuid(3DD2903D-E0AA-11d2-B63A-00C04F79498E),
+ helpstring("DShow Graph Segment Container"),
+ pointer_default(unique)
+ ]
+ interface IMSVidGraphSegmentContainer : IUnknown {
+ [propget, helpstring("Graph")] HRESULT Graph([out] IGraphBuilder **ppGraph);
+ [propget, helpstring("Input Segment")] HRESULT Input([out] IMSVidGraphSegment **pInput);
+ [propget, helpstring("Output Segment")] HRESULT Outputs([out] IEnumMSVidGraphSegment **pOutputs);
+ [propget, helpstring("Video Renderer")] HRESULT VideoRenderer([out] IMSVidGraphSegment **pVR);
+ [propget, helpstring("Audio Renderer")] HRESULT AudioRenderer([out] IMSVidGraphSegment **pAR);
+ [propget, helpstring("Features")] HRESULT Features([out] IEnumMSVidGraphSegment **pOutputs);
+ [propget, helpstring("Composites")] HRESULT Composites([out] IEnumMSVidGraphSegment **pComposites);
+ [propget, helpstring("Container")] HRESULT ParentContainer([out] IUnknown **ppContainer); // this allows the segments to get out and walk the dhtml hierarchy
+ HRESULT Decompose(IMSVidGraphSegment *pSegment);
+ HRESULT IsWindowless(); // the stock hwnd on the main vidctl is only valid if this is set
+
+ // be very careful using GetFocus(think twice and then don't). it is recommended that systems follow the model
+ // laid out by atvef and smil wherein the convergence of UI and video are implemented by providing the user interface
+ // as standard html/xml, etc with video incorporated as an element of this standard presentation.
+ // however, in the special case of dvd there is a prexisting standard which is conceptually inside out.
+ // that is, the UI is embedded in the video stream rather than the stream being embedded in the UI.
+ // as a consequence, buttons and menus can asynchronously pop up out of the video stream source(dvd navigator)
+ // and, may require the focus. this inside out paradigm is the only situation where
+ // getfocus should be used. otherwise, weird non-standard interactions will result.
+ HRESULT GetFocus();
+ };
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Direct Show Segment extension interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ typedef enum MSVidSegmentType {
+ MSVidSEG_SOURCE,
+ MSVidSEG_XFORM,
+ MSVidSEG_DEST,
+ } MSVidSegmentType;
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object,
+ uuid(1C15D482-911D-11d2-B632-00C04F79498E),
+ helpstring("DShow Graph Segment Builder Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidGraphSegment : IPersist {
+ // note: we separate init and load(via put_Container) because we want to associate device object
+ // with their device moniker at creation time. but, we don't want to take the
+ // hit of loading their filters until we're ready to build the graph because this segment may not get used
+ [propget] HRESULT Init([out, retval] IUnknown **pInit);
+ [propput] HRESULT Init([in] IUnknown *pInit);
+ HRESULT EnumFilters([out] IEnumFilters **pNewEnum); //filters in seg
+ [propget, helpstring("Graph that contains this segment")] HRESULT Container([out, retval] IMSVidGraphSegmentContainer **ppCtl);
+ [propput, helpstring("Graph that contains this segment")] HRESULT Container([in] IMSVidGraphSegmentContainer *pCtl);
+ [propget, helpstring("Type of Segment")] HRESULT Type([out, retval] MSVidSegmentType *pType);
+ [propget, helpstring("Category this segment is for")] HRESULT Category([out, retval] GUID *pGuid);
+ HRESULT Build(); // used to notify non-composition segment that the build/composition phase is about to start
+ HRESULT PreRun(); // used to notify segments that the graph is built and about to be started
+ HRESULT PostRun(); // called after graph is running
+ HRESULT PreStop(); // used to notify segments that the graph about to be stopped
+ HRESULT PostStop();// called after graph is stopped
+ HRESULT OnEventNotify(LONG lEventCode, LONG_PTR lEventParm1, LONG_PTR lEventParm2); //DShow events
+ HRESULT Decompose();
+ };
+
+
+ enum {
+ // button state
+ MSVIDCTL_LEFT_BUTTON =0x0001,
+ MSVIDCTL_RIGHT_BUTTON =0x0002,
+ MSVIDCTL_MIDDLE_BUTTON =0x0004,
+ MSVIDCTL_X_BUTTON1 =0x0008,
+ MSVIDCTL_X_BUTTON2 =0x0010,
+ // shift state
+ MSVIDCTL_SHIFT =0x0001,
+ MSVIDCTL_CTRL =0x0002,
+ MSVIDCTL_ALT =0x0004,
+ };
+
+ [object,
+ uuid(301C060E-20D9-4587-9B03-F82ED9A9943C),
+ helpstring("DShow Graph Segment Input Events"),
+ pointer_default(unique)
+ ]
+ // this should only be implemented used by input(source) devices with ui in the video
+ // stream(specifically dvd). see discussion of getfocus above
+ interface IMSVidGraphSegmentUserInput : IUnknown {
+ HRESULT Click();
+ HRESULT DblClick();
+ HRESULT KeyDown(short* KeyCode, short ShiftState);
+ HRESULT KeyPress(short* KeyAscii);
+ HRESULT KeyUp(short* KeyCode, short ShiftState);
+ HRESULT MouseDown(short ButtonState, short ShiftState, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
+ HRESULT MouseMove(short ButtonState, short ShiftState, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
+ HRESULT MouseUp(short ButtonState, short ShiftState, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object,
+ uuid(1C15D483-911D-11d2-B632-00C04F79498E),
+ helpstring("DShow Graph Segment Composition Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidCompositionSegment : IMSVidGraphSegment {
+ HRESULT Compose([in] IMSVidGraphSegment *upstream, [in] IMSVidGraphSegment *downstream);
+ [propget, helpstring("The upstream segment being composed by this composition segment")] HRESULT Up([out] IMSVidGraphSegment **upstream);
+ [propget, helpstring("The downstream segment being composed by this composition segment")] HRESULT Down([out] IMSVidGraphSegment **downstream);
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object,
+ uuid(3DD2903E-E0AA-11d2-B63A-00C04F79498E),
+ helpstring("DShow Graph Segment Enumerator"),
+ pointer_default(unique)
+ ]
+ interface IEnumMSVidGraphSegment : IUnknown {
+ HRESULT Next([in] ULONG celt, [out] IMSVidGraphSegment ** rgelt, [out] ULONG * pceltFetched);
+ HRESULT Skip([in] ULONG celt);
+ HRESULT Reset(void);
+ HRESULT Clone([out] IEnumMSVidGraphSegment** ppenum);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object,
+ uuid(DD47DE3F-9874-4f7b-8B22-7CB2688461E7),
+ helpstring("DShow Video Renderer Graph Segment Builder Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVRGraphSegment : IMSVidGraphSegment {
+ // NOTE: because of the way ActiveX controls work there is a tight coupling
+ // between the video control itself and the video renderer device segment
+ // as a consequence there are important interfaces such as positioning that
+ // come through the control via the various ole interfaces which we need to
+ // pass to the video renderer but we don't want script to access directly
+ // there are also stock properties such as refresh and autosize that must also be
+ // implemented directly on the video control and passed through to the video renderer
+
+ // from ole interfaces
+ [hidden, restricted, propput] HRESULT _VMRendererMode([in] LONG dwMode);
+ [hidden, restricted, propput] HRESULT Owner([in] HWND Window);
+ [hidden, restricted, propget] HRESULT Owner([out, retval] HWND* Window);
+ // from ole interfaces
+ [hidden, restricted, propget] HRESULT UseOverlay([out, retval] VARIANT_BOOL *UseOverlayVal);
+ [hidden, restricted, propput] HRESULT UseOverlay([in] VARIANT_BOOL UseOverlayVal);
+ // from top-level control visibility state
+ [hidden, restricted, propget] HRESULT Visible([out, retval] VARIANT_BOOL* Visible);
+ [hidden, restricted, propput] HRESULT Visible([in] VARIANT_BOOL Visible);
+
+ // clients must go through top-level vidctl interfaces to access this. since vidctl's ondraw
+ // actually paints this, it needs to know about it.
+ [propget, hidden, restricted] HRESULT ColorKey([out, retval] OLE_COLOR* ColorKey);
+ [propput, hidden, restricted] HRESULT ColorKey([in] OLE_COLOR ColorKey);
+ // from ole interfaces and window msgs
+ [propget, hidden, restricted] HRESULT Source([out, retval] LPRECT r);
+ [propput, hidden, restricted] HRESULT Source([in] RECT r);
+ // from ole interfaces and window msgs
+ [propget, hidden, restricted] HRESULT Destination([out, retval] LPRECT r);
+ [propput, hidden, restricted] HRESULT Destination([in] RECT r);
+ [propget, hidden, restricted] HRESULT NativeSize([out] LPSIZE sizeval, [out] LPSIZE aspectratio);
+ // letterboxing color if we're using
+ [propget, hidden, restricted] HRESULT BorderColor([out, retval] OLE_COLOR* color);
+ [propput, hidden, restricted] HRESULT BorderColor([in] OLE_COLOR color);
+ // letterbox or stretch
+ [propget, hidden, restricted] HRESULT MaintainAspectRatio([out, retval] VARIANT_BOOL *fMaintain);
+ [propput, hidden, restricted] HRESULT MaintainAspectRatio([in] VARIANT_BOOL fMaintain);
+
+ // from top-level control refresh method
+ [hidden, restricted] HRESULT Refresh();
+ [hidden, restricted] HRESULT DisplayChange();
+ [hidden, restricted] HRESULT RePaint([in] HDC hdc);
+
+ };
+
+
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////
+//
+// Automation compliant device object interfaces for bpc video control
+//
+///////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// input devices
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(1C15D47C-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Control Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidDevice : IDispatch {
+ // base device properties
+ [propget, id(dispidName)] HRESULT Name([out, retval] BSTR *Name);
+ [propget, id(dispidStatus)] HRESULT Status([out, retval] long *Status);
+ [propput, id(dispidDevPower)] HRESULT Power([in] VARIANT_BOOL Power);
+ [propget, id(dispidDevPower)] HRESULT Power([retval, out] VARIANT_BOOL *Power);
+ // DShow Associated properties
+ // note: filter can be retrieved by QIing for IMSVidGraphSegment and enumerating
+ [propget, id(dispidKSCat)] HRESULT Category([out, retval] BSTR *Guid);
+ [propget, id(dispidCLSID)] HRESULT ClassID([out, retval] BSTR *Clsid);
+ [propget, id(dispid_KSCat), hidden, restricted] HRESULT _Category([out, retval] GUID* Guid);
+ [propget, id(dispid_CLSID), hidden, restricted] HRESULT _ClassID([out, retval] GUID* Clsid);
+ [id(dispid_IsEqualDevice), helpstring("does the passed in device represent the same underlying hardware")] HRESULT IsEqualDevice([in] IMSVidDevice* Device, [out, retval] VARIANT_BOOL* IsEqual);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(37B0353D-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Input Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidInputDevice : IMSVidDevice {
+ [id(dispidViewable)]HRESULT IsViewable([in] VARIANT* v, [out, retval] VARIANT_BOOL *pfViewable); // can this device view this item?
+ [id(dispidDevView)]HRESULT View([in] VARIANT* v); // set this device to view this item
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation,
+ uuid(1C15D480-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Control Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidDeviceEvent : IDispatch {
+ [id(eventidStateChange)] HRESULT StateChange([in] IMSVidDevice *lpd, [in] long oldState, [in] long newState);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation,
+ uuid(37B0353E-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Input Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidInputDeviceEvent : IDispatch {
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(1C15D47F-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Control Video Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVideoInputDevice : IMSVidInputDevice {
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+
+ [object, dual, oleautomation,
+ uuid(37B03538-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Playback Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidPlayback : IMSVidInputDevice {
+ // note: the following methods control the playback device *NOT* the graph.
+ // if the underlying source filter only supports these functions via
+ // imediacontrol on the graph then this device segment object should return E_NOTIMPL.
+ [propget, id(dispid_EnableResetOnStop), helpstring("EnableResetOnStop")] HRESULT EnableResetOnStop([out, retval] VARIANT_BOOL *pVal);
+ [propput, id(dispid_EnableResetOnStop), helpstring("EnableResetOnStop")] HRESULT EnableResetOnStop([in] VARIANT_BOOL newVal);
+ [id(dispidDevRun)] HRESULT Run();
+ [id(dispidDevPause)] HRESULT Pause();
+ [id(dispidDevStop)] HRESULT Stop();
+ [propget, id(dispidDevCanStep)] HRESULT CanStep([in] VARIANT_BOOL fBackwards, [out,retval] VARIANT_BOOL *pfCan);
+ [id(dispidDevStep)] HRESULT Step([in] long lStep);
+ [propput, id(dispidrate), helpstring("Rate")] HRESULT Rate([in] double plRate);
+ [propget, id(dispidrate), helpstring("Rate")] HRESULT Rate([out,retval]double *plRate);
+ [propput, id(dispidposition), helpstring("Position")] HRESULT CurrentPosition([in] long lPosition);
+ [propget, id(dispidposition), helpstring("Position")] HRESULT CurrentPosition([out, retval] long* lPosition);
+ [propput, id(dispidpositionmode), helpstring("PositionMode")] HRESULT PositionMode([in] PositionModeList lPositionMode);
+ [propget, id(dispidpositionmode), helpstring("PositionMode")] HRESULT PositionMode([out, retval] PositionModeList* lPositionMode);
+ [propget, id(dispidlength), helpstring("Length")] HRESULT Length([out, retval] long *lLength);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation,
+ uuid(37B0353B-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Playback Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidPlaybackEvent : IMSVidInputDeviceEvent {
+ [id(eventidEndOfMedia)] HRESULT EndOfMedia([in] IMSVidPlayback *lpd);
+ };
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(1C15D47D-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Tuner Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidTuner : IMSVidVideoInputDevice {
+ [propget, id(dispidTune)] HRESULT Tune([out, retval] ITuneRequest **ppTR);
+ [propput, id(dispidTune)] HRESULT Tune([in] ITuneRequest *pTR);
+ [propget, id(dispidTS)] HRESULT TuningSpace([out, retval] ITuningSpace **plTS);
+ [hidden, restricted, propput, id(dispidTS)] HRESULT TuningSpace([in] ITuningSpace* plTS);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(1C15D485-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Control Tuner Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidTunerEvent : IMSVidInputDeviceEvent {
+ [id(eventidOnTuneChanged)] HRESULT TuneChanged([in] IMSVidTuner *lpd);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(1C15D47E-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video TV Tuner Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidAnalogTuner : IMSVidTuner {
+ [propget, id(dispidTuneChan)] HRESULT Channel([out, retval] long *Channel);
+ [propput, id(dispidTuneChan)] HRESULT Channel([in] long Channel);
+ [propget, id(dispidDevVideoFrequency)] HRESULT VideoFrequency([retval, out] long *lcc);
+ [propget, id(dispidDevAudioFrequency)] HRESULT AudioFrequency([retval, out] long *lcc);
+ // note: this is not LCID, this is physical location of device using
+ // international dialing code value
+ [propget, id(dispidDevCountryCode)] HRESULT CountryCode([retval, out] long *lcc);
+ [propput, id(dispidDevCountryCode)] HRESULT CountryCode([in] long lcc);
+ // analog specific shortcut to enabling a different audio component
+ [propget, id(dispidDevSAP)] HRESULT SAP([out, retval] VARIANT_BOOL *pfSapOn);
+ [propput, id(dispidDevSAP)] HRESULT SAP([in] VARIANT_BOOL fSapOn);
+ // methods
+ [id(dispidChannelAvailable)] HRESULT ChannelAvailable([in] long nChannel, [out] long *SignalStrength, [retval, out] VARIANT_BOOL *fSignalPresent);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation,
+ uuid(1C15D486-911D-11d2-B632-00C04F79498E),
+ helpstring("MS Video Control TV Tuner Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidAnalogTunerEvent : IMSVidTunerEvent {
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(37B03539-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control File Playback Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidFilePlayback : IMSVidPlayback {
+ [propget, id(dispidDevFileName)] HRESULT FileName([out, retval] BSTR *FileName);
+ [propput, id(dispidDevFileName)] HRESULT FileName([in] BSTR FileName);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(37B0353A-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control File Playback Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidFilePlaybackEvent : IMSVidPlaybackEvent {
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ typedef enum
+ {
+ dvdMenu_Title = 2,
+ dvdMenu_Root = dvdMenu_Title + 1,
+ dvdMenu_Subpicture = dvdMenu_Root + 1,
+ dvdMenu_Audio = dvdMenu_Subpicture + 1,
+ dvdMenu_Angle = dvdMenu_Audio + 1,
+ dvdMenu_Chapter = dvdMenu_Angle + 1
+ } DVDMenuIDConstants;
+
+ typedef enum
+ {
+ dvdState_Undefined = -2,
+ dvdState_Unitialized = dvdState_Undefined + 1,
+ dvdState_Stopped = dvdState_Unitialized + 1,
+ dvdState_Paused = dvdState_Stopped + 1,
+ dvdState_Running = dvdState_Paused + 1
+ } DVDFilterState;
+
+ typedef enum
+ {
+ dvdStruct_Volume = 0x1,
+ dvdStruct_Title = 0x2,
+ dvdStruct_ParentalID = 0x3,
+ dvdStruct_PartOfTitle = 0x4,
+ dvdStruct_Cell = 0x5,
+ dvdStream_Audio = 0x10,
+ dvdStream_Subpicture = 0x11,
+ dvdStream_Angle = 0x12,
+ dvdChannel_Audio = 0x20,
+ dvdGeneral_Name = 0x30,
+ dvdGeneral_Comments = 0x31,
+ dvdTitle_Series = 0x38,
+ dvdTitle_Movie = 0x39,
+ dvdTitle_Video = 0x3a,
+ dvdTitle_Album = 0x3b,
+ dvdTitle_Song = 0x3c,
+ dvdTitle_Other = 0x3f,
+ dvdTitle_Sub_Series = 0x40,
+ dvdTitle_Sub_Movie = 0x41,
+ dvdTitle_Sub_Video = 0x42,
+ dvdTitle_Sub_Album = 0x43,
+ dvdTitle_Sub_Song = 0x44,
+ dvdTitle_Sub_Other = 0x47,
+ dvdTitle_Orig_Series = 0x48,
+ dvdTitle_Orig_Movie = 0x49,
+ dvdTitle_Orig_Video = 0x4a,
+ dvdTitle_Orig_Album = 0x4b,
+ dvdTitle_Orig_Song = 0x4c,
+ dvdTitle_Orig_Other = 0x4f,
+ dvdOther_Scene = 0x50,
+ dvdOther_Cut = 0x51,
+ dvdOther_Take = 0x52
+ } DVDTextStringType;
+
+ typedef enum
+ {
+ dvdSPExt_NotSpecified = 0,
+ dvdSPExt_Caption_Normal = 1,
+ dvdSPExt_Caption_Big = 2,
+ dvdSPExt_Caption_Children = 3,
+ dvdSPExt_CC_Normal = 5,
+ dvdSPExt_CC_Big = 6,
+ dvdSPExt_CC_Children = 7,
+ dvdSPExt_Forced = 9,
+ dvdSPExt_DirectorComments_Normal = 13,
+ dvdSPExt_DirectorComments_Big = 14,
+ dvdSPExt_DirectorComments_Children = 15
+ } DVDSPExt;
+
+ [object, dual, oleautomation, hidden,
+ uuid(CF45F88B-AC56-4EE2-A73A-ED04E2885D3C),
+ helpstring("IMSVidWebDVD Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidWebDVD : IMSVidPlayback {
+
+ HRESULT OnDVDEvent([in]long lEvent, [in]LONG_PTR lParam1, [in]LONG_PTR lParam2);
+ [id(dispid_playtitle), helpstring("method PlayTitle")] HRESULT PlayTitle([in] long lTitle);
+ [id(dispid_playchapterintitle), helpstring("method PlayChapterInTitle")] HRESULT PlayChapterInTitle([in] long lTitle, [in] long lChapter);
+ [id(dispid_playchapter), helpstring("method PlayChapter")] HRESULT PlayChapter([in] long lChapter);
+ [id(dispid_playchaptersautostop), helpstring("method PlayChaptersAutoStop")] HRESULT PlayChaptersAutoStop([in] long lTitle, [in] long lstrChapter, [in] long lChapterCount);
+ [id(dispid_playattime), helpstring("method PlayAtTime")] HRESULT PlayAtTime([in] BSTR strTime);
+ [id(dispid_playattimeintitle), helpstring("method PlayAtTimeInTitle")] HRESULT PlayAtTimeInTitle([in] long lTitle, [in] BSTR strTime);
+ [id(dispid_playperiodintitleautostop), helpstring("method PlayPeriodInTitleAutoStop")] HRESULT PlayPeriodInTitleAutoStop([in] long lTitle, [in] BSTR strStartTime, [in] BSTR strEndTime);
+ [id(dispid_replaychapter), helpstring("method ReplayChapter")] HRESULT ReplayChapter();
+ [id(dispid_playprevchapter), helpstring("method PlayPrevChapter")] HRESULT PlayPrevChapter();
+ [id(dispid_playnextchapter), helpstring("method PlayNextChapter")] HRESULT PlayNextChapter();
+ [id(dispid_stilloff), helpstring("method StillOff")] HRESULT StillOff();
+ [propget, id(dispid_audiolanguage), helpstring("AudioLanguage")] HRESULT AudioLanguage([in] long lStream, [in, defaultvalue(0)] VARIANT_BOOL fFormat, [out, retval] BSTR* strAudioLang);
+ [id(dispid_showmenu), helpstring("method ShowMenu")] HRESULT ShowMenu([in] DVDMenuIDConstants MenuID);
+ [id(dispid_resume), helpstring("method Resume")] HRESULT Resume();
+ [id(dispid_returnfromsubmenu), helpstring("method ReturnFromSubmenu")] HRESULT ReturnFromSubmenu();
+ [propget,id(dispid_buttonsavailable), helpstring("ButtonsAvailable")] HRESULT ButtonsAvailable([out, retval] long *pVal);
+ [propget,id(dispid_currentbutton), helpstring("CurrentButton")] HRESULT CurrentButton([out, retval] long *pVal);
+ [id(dispid_SelectAndActivateButton), helpstring("method SelectAndActivateButton")] HRESULT SelectAndActivateButton([in] long lButton);
+ [id(dispid_ActivateButton), helpstring("method ActivateButton")] HRESULT ActivateButton();
+ [id(dispid_SelectRightButton), helpstring("method SelectRightButton")] HRESULT SelectRightButton();
+ [id(dispid_SelectLeftButton), helpstring("method SelectLeftButton")] HRESULT SelectLeftButton();
+ [id(dispid_SelectLowerButton), helpstring("method SelectLowerButton")] HRESULT SelectLowerButton();
+ [id(dispid_SelectUpperButton), helpstring("method SelectUpperButton")] HRESULT SelectUpperButton();
+ [id(dispid_ActivateAtPosition), helpstring("method ActivateAtPosition")] HRESULT ActivateAtPosition([in] long xPos, [in] long yPos);
+ [id(dispid_SelectAtPosition), helpstring("method SelectAtPosition")] HRESULT SelectAtPosition([in] long xPos, [in] long yPos);
+ [propget, id(dispid_ButtonAtPosition), helpstring("ButtonAtPosition")] HRESULT ButtonAtPosition([in] long xPos, [in] long yPos, [out, retval] long* plButton);
+ [propget, id(dispid_NumberOfChapters), helpstring("NumberOfChapters")] HRESULT NumberOfChapters([in] long lTitle, [out, retval] long *pVal);
+ [propget, id(dispid_TotalTitleTime), helpstring("TotalTitleTime")] HRESULT TotalTitleTime([out, retval] BSTR *pVal);
+ [propget, id(dispid_TitlesAvailable), helpstring("TitlesAvailable")] HRESULT TitlesAvailable([out, retval] long* pVal);
+ [propget, id(dispid_VolumesAvailable), helpstring("VolumesAvailable")] HRESULT VolumesAvailable([out, retval] long *pVal);
+ [propget, id(dispid_CurrentVolume), helpstring("CurrentVolume")] HRESULT CurrentVolume([out, retval] long *pVal);
+ [propget, id(dispid_CurrentDiscSide), helpstring("CurrentDiscSide")] HRESULT CurrentDiscSide([out, retval] long *pVal);
+ [propget, id(dispid_CurrentDomain), helpstring("CurrentDomain")] HRESULT CurrentDomain([out, retval] long *pVal);
+ [propget, id(dispid_CurrentChapter), helpstring("CurrentChapter")] HRESULT CurrentChapter([out, retval] long *pVal);
+ [propget, id(dispid_CurrentTitle), helpstring("CurrentTitle")] HRESULT CurrentTitle([out, retval] long *pVal);
+ [propget, id(dispid_CurrentTime), helpstring("CurrentTime")] HRESULT CurrentTime([out, retval] BSTR *pVal);
+ [id(dispid_DVDTimeCode2bstr), helpstring("method DVDTimeCode2bstr")] HRESULT DVDTimeCode2bstr([in] long timeCode, [out, retval] BSTR *pTimeStr);
+ [propget, id(dispid_DVDDirectory), helpstring("DVDDirectory")] HRESULT DVDDirectory([out, retval] BSTR *pVal);
+ [propput, id(dispid_DVDDirectory), helpstring("DVDDirectory")] HRESULT DVDDirectory([in] BSTR newVal);
+ [id(dispid_IsSubpictureStreamEnabled), helpstring("method IsSubpictureStreamEnabled")] HRESULT IsSubpictureStreamEnabled([in] long lstream, [out, retval] VARIANT_BOOL *fEnabled);
+ [id(dispid_IsAudioStreamEnabled), helpstring("method IsAudioStreamEnabled")] HRESULT IsAudioStreamEnabled([in] long lstream, [out, retval] VARIANT_BOOL *fEnabled);
+ [propget, id(dispid_CurrentSubpictureStream), helpstring("CurrentSubpictureStream")] HRESULT CurrentSubpictureStream([out, retval] long *pVal);
+ [propput, id(dispid_CurrentSubpictureStream), helpstring("CurrentSubpictureStream")] HRESULT CurrentSubpictureStream([in] long newVal);
+ [propget, id(dispid_SubpictureLanguage), helpstring("SubpictureLanguage")] HRESULT SubpictureLanguage(long lStream, [out, retval] BSTR* strLanguage);
+ [propget, id(dispid_CurrentAudioStream), helpstring("CurrentAudioStream")] HRESULT CurrentAudioStream([out, retval] long *pVal);
+ [propput, id(dispid_CurrentAudioStream), helpstring("CurrentAudioStream")] HRESULT CurrentAudioStream([in] long newVal);
+ [propget, id(dispid_AudioStreamsAvailable), helpstring("AudioStreamsAvailable")] HRESULT AudioStreamsAvailable([out, retval] long *pVal);
+ [propget, id(dispid_AnglesAvailable), helpstring("AnglesAvailable")] HRESULT AnglesAvailable([out, retval] long *pVal);
+ [propget, id(dispid_CurrentAngle), helpstring("CurrentAngle")] HRESULT CurrentAngle([out, retval] long *pVal);
+ [propput, id(dispid_CurrentAngle), helpstring("CurrentAngle")] HRESULT CurrentAngle([in] long newVal);
+ [propget, id(dispid_SubpictureStreamsAvailable), helpstring("SubpictureStreamsAvailable")] HRESULT SubpictureStreamsAvailable([out, retval] long *pVal);
+ [propget, id(dispid_SubpictureOn), helpstring("SubpictureOn")] HRESULT SubpictureOn([out, retval] VARIANT_BOOL *pVal);
+ [propput, id(dispid_SubpictureOn), helpstring("SubpictureOn")] HRESULT SubpictureOn([in] VARIANT_BOOL newVal);
+ [propget, id(dispid_DVDUniqueID), helpstring("DVDUniqueID")] HRESULT DVDUniqueID([out, retval] BSTR *pVal);
+ [id(dispid_AcceptParentalLevelChange), helpstring("method AcceptParentalLevelChange")] HRESULT AcceptParentalLevelChange([in] VARIANT_BOOL fAccept, [in] BSTR strUserName, [in] BSTR strPassword);
+ [id(dispid_NotifyParentalLevelChange), helpstring("method NotifyParentalLevelChange")] HRESULT NotifyParentalLevelChange([in] VARIANT_BOOL newVal);
+ [id(dispid_SelectParentalCountry), helpstring("method SelectParentalCountry")] HRESULT SelectParentalCountry([in] long lCountry, [in] BSTR strUserName, [in] BSTR strPassword);
+ [id(dispid_SelectParentalLevel), helpstring("method SelectParentalLevel")] HRESULT SelectParentalLevel([in] long lParentalLevel, [in] BSTR strUserName, [in] BSTR strPassword);
+ [propget, id(dispid_TitleParentalLevels), helpstring("TitleParentalLevels")] HRESULT TitleParentalLevels([in] long lTitle, [out, retval] long* plParentalLevels);
+ [propget, id(dispid_PlayerParentalCountry), helpstring("PlayerParentalCountry")] HRESULT PlayerParentalCountry([out, retval] long* plCountryCode);
+ [propget, id(dispid_PlayerParentalLevel), helpstring("PlayerParentalLevel")] HRESULT PlayerParentalLevel([out, retval] long* plParentalLevel);
+ [id(dispid_Eject), helpstring("method Eject")] HRESULT Eject();
+ [id(dispid_UOPValid), helpstring("method UOPValid")] HRESULT UOPValid([in] long lUOP, [out, retval] VARIANT_BOOL* pfValid);
+ [propget, id(dispid_SPRM), helpstring("SPRM")] HRESULT SPRM([in] long lIndex, [out, retval] short *psSPRM);
+ [propget, id(dispid_GPRM), helpstring("GPRM")] HRESULT GPRM([in] long lIndex, [out, retval] short *psSPRM);
+ [propput, id(dispid_GPRM), helpstring("GPRM")] HRESULT GPRM([in] long lIndex, [in] short sValue);
+ [propget, id(dispid_DVDTextStringType), helpstring("DVDTextStringType")] HRESULT DVDTextStringType([in] long lLangIndex, [in] long lStringIndex, [out, retval] DVDTextStringType* pType);
+ [propget, id(dispid_DVDTextString), helpstring("DVDTextString")] HRESULT DVDTextString([in] long lLangIndex, [in] long lStringIndex, [out, retval] BSTR* pstrText);
+ [propget, id(dispid_DVDTextNumberOfStrings), helpstring("DVDTextNumberOfStrings")] HRESULT DVDTextNumberOfStrings([in] long lLangIndex, [out, retval] long* plNumOfStrings);
+ [propget, id(dispid_DVDTextNumberOfLanguages), helpstring("DVDTextNumberOfLanguages")] HRESULT DVDTextNumberOfLanguages([out, retval] long* plNumOfLangs);
+ [propget, id(dispid_DVDTextLanguageLCID), helpstring("DVDTextLanguageLCID")] HRESULT DVDTextLanguageLCID([in] long lLangIndex, [out, retval] long* lcid);
+ [id(dispid_RegionChange), helpstring("method RegionChange")] HRESULT RegionChange();
+ [propget, id(dispid_DVDAdm), helpstring("DVDAdm")] HRESULT DVDAdm([out, retval] IDispatch* *pVal);
+ [id(dispid_DeleteBookmark), helpstring("method DeleteBookmark")] HRESULT DeleteBookmark();
+ [id(dispid_RestoreBookmark), helpstring("method RestoreBookmark")] HRESULT RestoreBookmark();
+ [id(dispid_SaveBookmark), helpstring("method SaveBookmark")] HRESULT SaveBookmark();
+ [id(dispid_SelectDefaultAudioLanguage), helpstring("method SelectDefaultAudioLanguage")] HRESULT SelectDefaultAudioLanguage([in] long lang, [in] long ext);
+ [id(dispid_SelectDefaultSubpictureLanguage), helpstring("method SelectDefaultSubpictureLanguage")] HRESULT SelectDefaultSubpictureLanguage([in] long lang, [in] DVDSPExt ext);
+ [propget, id(dispid_PreferredSubpictureStream), helpstring("PreferredSubpictureStream")] HRESULT PreferredSubpictureStream([out, retval] long *pVal);
+ [propget, id(dispid_DefaultMenuLanguage), helpstring("DefaultMenuLanguage")] HRESULT DefaultMenuLanguage([out, retval] long* lang);
+ [propput, id(dispid_DefaultMenuLanguage), helpstring("DefaultMenuLanguage")] HRESULT DefaultMenuLanguage([in] long lang);
+ [propget, id(dispid_DefaultSubpictureLanguage), helpstring("DefaultSubpictureLanguage")] HRESULT DefaultSubpictureLanguage([out, retval] long* lang);
+ [propget, id(dispid_DefaultAudioLanguage), helpstring("DefaultAudioLanguage")] HRESULT DefaultAudioLanguage([out, retval] long *lang);
+ [propget, id(dispid_DefaultSubpictureLanguageExt), helpstring("DefaultSubpictureLanguageExt")] HRESULT DefaultSubpictureLanguageExt([out, retval] DVDSPExt* ext);
+ [propget, id(dispid_DefaultAudioLanguageExt), helpstring("DefaultAudioLanguageExt")] HRESULT DefaultAudioLanguageExt([out, retval] long *ext);
+ [propget, id(dispid_LanguageFromLCID), helpstring("LanguageFromLCID")] HRESULT LanguageFromLCID([in] long lcid, [out, retval] BSTR* lang);
+ [propget, id(dispid_KaraokeAudioPresentationMode), helpstring("KaraokeAudioPresentationMode")] HRESULT KaraokeAudioPresentationMode([out, retval] long *pVal);
+ [propput, id(dispid_KaraokeAudioPresentationMode), helpstring("KaraokeAudioPresentationMode")] HRESULT KaraokeAudioPresentationMode([in] long newVal);
+ [propget, id(dispid_KaraokeChannelContent), helpstring("KaraokeChannelContent")] HRESULT KaraokeChannelContent([in] long lStream, [in] long lChan, [out, retval] long* lContent);
+ [propget, id(dispid_KaraokeChannelAssignment), helpstring("KaraokeChannelAssignment")] HRESULT KaraokeChannelAssignment([in] long lStream, [out, retval] long *lChannelAssignment);
+ [id(dispid_RestorePreferredSettings), helpstring("method RestorePreferredSettings")] HRESULT RestorePreferredSettings();
+ [propget, id(dispid_ButtonRect), helpstring("ButtonRect")] HRESULT ButtonRect([in] long lButton, [out, retval] IMSVidRect** pRect);
+ [propget, id(dispid_DVDScreenInMouseCoordinates), helpstring("DVDScreenInMouseCoordinates")] HRESULT DVDScreenInMouseCoordinates([out, retval] IMSVidRect** ppRect);
+ [propput, id(dispid_DVDScreenInMouseCoordinates), helpstring("DVDScreenInMouseCoordinates")] HRESULT DVDScreenInMouseCoordinates([in] IMSVidRect* pRect);
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(B4F7A674-9B83-49cb-A357-C63B871BE958),
+ helpstring("MS Video Control File Playback Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidWebDVDEvent : IMSVidPlaybackEvent {
+ [id(eventidDVDNotify), helpstring("Notifies the client about DVD Code")] HRESULT DVDNotify([in]long lEventCode, [in]VARIANT lParam1, [in]VARIANT lParam2);
+ [id(eventidPlayForwards), helpstring("Notifies the client")] HRESULT PlayForwards([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayBackwards), helpstring("Notifies the client")] HRESULT PlayBackwards([in] VARIANT_BOOL bEnabled);
+ [id(eventidShowMenu), helpstring("Notifies the client")] HRESULT ShowMenu([in]DVDMenuIDConstants, [in] VARIANT_BOOL bEnabled);
+ [id(eventidResume), helpstring("Notifies the client")] HRESULT Resume([in] VARIANT_BOOL bEnabled);
+ [id(eventidSelectOrActivateButton), helpstring("Notifies the client")] HRESULT SelectOrActivateButton([in] VARIANT_BOOL bEnabled);
+ [id(eventidStillOff), helpstring("Notifies the client")] HRESULT StillOff([in] VARIANT_BOOL bEnabled);
+ [id(eventidPauseOn), helpstring("Notifies the client")] HRESULT PauseOn([in] VARIANT_BOOL bEnabled);
+ [id(eventidChangeCurrentAudioStream), helpstring("Notifies the client")] HRESULT ChangeCurrentAudioStream([in] VARIANT_BOOL bEnabled);
+ [id(eventidChangeCurrentSubpictureStream), helpstring("Notifies the client")] HRESULT ChangeCurrentSubpictureStream([in] VARIANT_BOOL bEnabled);
+ [id(eventidChangeCurrentAngle), helpstring("Notifies the client")] HRESULT ChangeCurrentAngle([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayAtTimeInTitle), helpstring("Notifies the client")] HRESULT PlayAtTimeInTitle([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayAtTime), helpstring("Notifies the client")] HRESULT PlayAtTime([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayChapterInTitle), helpstring("Notifies the client")] HRESULT PlayChapterInTitle([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayChapter), helpstring("Notifies the client")] HRESULT PlayChapter([in] VARIANT_BOOL bEnabled);
+ [id(eventidReplayChapter), helpstring("Notifies the client")] HRESULT ReplayChapter([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayNextChapter), helpstring("Notifies the client")] HRESULT PlayNextChapter([in] VARIANT_BOOL bEnabled);
+ [id(eventidStop), helpstring("Notifies the client")] HRESULT Stop([in] VARIANT_BOOL bEnabled);
+ [id(eventidReturnFromSubmenu), helpstring("Notifies the client")] HRESULT ReturnFromSubmenu([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayTitle), helpstring("Notifies the client")] HRESULT PlayTitle([in] VARIANT_BOOL bEnabled);
+ [id(eventidPlayPrevChapter), helpstring("Notifies the client")] HRESULT PlayPrevChapter([in] VARIANT_BOOL bEnabled);
+ [id(eventidChangeKaraokePresMode), helpstring("Notifies the client")] HRESULT ChangeKaraokePresMode([in] VARIANT_BOOL bEnabled);
+ [id(eventidChangeVideoPresMode), helpstring("Notifies the client")] HRESULT ChangeVideoPresMode([in] VARIANT_BOOL bEnabled);
+ };
+
+ [object, dual, oleautomation, hidden,
+ uuid(B8BE681A-EB2C-47f0-B415-94D5452F0E05),
+ helpstring("IMSVidWebDVDAdm Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidWebDVDAdm : IDispatch
+ {
+ [id(dispidChangePassword), helpstring("method ChangePassword")] HRESULT ChangePassword([in]BSTR strUserName, [in]BSTR strOld, [in]BSTR strNew);
+ [id(dispidSaveParentalLevel), helpstring("method SaveParentalLevel")] HRESULT SaveParentalLevel([in]long level,[in]BSTR strUserName, [in]BSTR strPassword);
+ [id(dispidSaveParentalCountry), helpstring("method SaveParentalCountry")] HRESULT SaveParentalCountry([in]long country,[in]BSTR strUserName, [in]BSTR strPassword);
+ [id(dispidConfirmPassword), hidden, restricted, helpstring("method ConfirmPassword")] HRESULT ConfirmPassword([in]BSTR strUserName, [in]BSTR strPassword, [out, retval] VARIANT_BOOL *pVal);
+ [id(dispidGetParentalLevel), helpstring("method GetParentalLevel")] HRESULT GetParentalLevel([out, retval] long *lLevel);
+ [id(dispidGetParentalCountry), helpstring("method GetParentalCountry")] HRESULT GetParentalCountry([out, retval] long *lCountry);
+ [propget, id(dispidDefaultAudioLCID), helpstring("property DefaultAudioLCID")] HRESULT DefaultAudioLCID([out, retval] long *pVal);
+ [propput, id(dispidDefaultAudioLCID), helpstring("property DefaultAudioLCID")] HRESULT DefaultAudioLCID([in] long newVal);
+ [propget, id(dispidDefaultSubpictureLCID), helpstring("property DefaultSubpictureLCID")] HRESULT DefaultSubpictureLCID([out, retval] long *pVal);
+ [propput, id(dispidDefaultSubpictureLCID), helpstring("property DefaultSubpictureLCID")] HRESULT DefaultSubpictureLCID([in] long newVal);
+ [propget, id(dispidDefaultMenuLCID), helpstring("property DefaultMenuLCID")] HRESULT DefaultMenuLCID([out, retval] long *pVal);
+ [propput, id(dispidDefaultMenuLCID), helpstring("property DefaultMenuLCID")] HRESULT DefaultMenuLCID([in] long newVal);
+ [propget, id(dispidBookmarkOnStop), helpstring("property BookmarkOnStop")] HRESULT BookmarkOnStop([out, retval] VARIANT_BOOL *pVal);
+ [propput, id(dispidBookmarkOnStop), helpstring("property BookmarkOnStop")] HRESULT BookmarkOnStop([in] VARIANT_BOOL newVal);
+ };
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// output devices
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(37B03546-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Output Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidOutputDevice : IMSVidDevice {
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation,
+ uuid(2E6A14E2-571C-11d3-B652-00C04F79498E),
+ helpstring("MS Video Control Output Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidOutputDeviceEvent : IMSVidDeviceEvent {
+ };
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// features
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(37B03547-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Feature Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidFeature : IMSVidDevice {
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation,
+ uuid(3DD2903C-E0AA-11d2-B63A-00C04F79498E),
+ helpstring("MS Video Control Feature Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidFeatureEvent : IMSVidDeviceEvent {
+ };
+
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(C0020FD4-BEE7-43d9-A495-9F213117103D),
+ helpstring("MS Video Control Encoder Feature Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidEncoder : IMSVidFeature {
+ [propget, id(dispid_videoencoderint)] HRESULT VideoEncoderInterface([out, retval] IUnknown **ppEncInt);
+ [propget, id(dispid_audioencoderint)] HRESULT AudioEncoderInterface([out, retval] IUnknown **ppEncInt);
+ };
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation,
+ uuid(11EBC158-E712-4d1f-8BB3-01ED5274C4CE),
+ helpstring("MS Video Control XDS Feature Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidXDS : IMSVidFeature {
+ };
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(334125C1-77E5-11d3-B653-00C04F79498E),
+ helpstring("MS Video Control Data Services Feature Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidDataServices : IMSVidFeature {
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(334125C2-77E5-11d3-B653-00C04F79498E),
+ helpstring("MS Video Control Data Services Feature Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidDataServicesEvent : IMSVidDeviceEvent {
+ };
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(99652EA1-C1F7-414f-BB7B-1C967DE75983),
+ helpstring("MS Video Control Closed Captioning Feature Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidClosedCaptioning : IMSVidFeature {
+ [propget, id(dispidCCEnable)] HRESULT Enable([out, retval] VARIANT_BOOL *On);
+ [propput, id(dispidCCEnable)] HRESULT Enable([in] VARIANT_BOOL On);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(E00CB864-A029-4310-9987-A873F5887D97),
+ helpstring("MS Video Control Closed Captioning Feature Interface 2"),
+ pointer_default(unique)
+ ]
+ interface IMSVidClosedCaptioning2 : IMSVidClosedCaptioning{
+ [propget, id(dispidService)] HRESULT Service([out, retval] MSVidCCService *On);
+ [propput, id(dispidService)] HRESULT Service([in] MSVidCCService On);
+ };
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// video renderer
+//
+///////////////////////////////////////////////////////////////////////////////
+// need to add msvidvidoerenderer2 that has allocator prestenter stuff...
+ typedef enum {
+ sslFullSize,
+ sslClipByOverScan,
+ sslClipByClipRect,
+ } SourceSizeList;
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+
+ [object, dual, oleautomation, hidden,
+ uuid(37B03540-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Video Renderer Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVideoRenderer : IMSVidOutputDevice {
+ // Properties
+ [propget, id(dispidCustomCompositorClass)] HRESULT CustomCompositorClass([out, retval] BSTR *CompositorCLSID);
+ [propput, id(dispidCustomCompositorClass)] HRESULT CustomCompositorClass([in] BSTR CompositorCLSID);
+ [propget, hidden, restricted, id(dispid_CustomCompositorClass)] HRESULT _CustomCompositorClass([out, retval] GUID* CompositorCLSID);
+ [propput, hidden, restricted, id(dispid_CustomCompositorClass)] HRESULT _CustomCompositorClass([in] REFCLSID CompositorCLSID);
+ [propget, hidden, restricted, id(dispid_CustomCompositor)] HRESULT _CustomCompositor([out, retval] IVMRImageCompositor** Compositor);
+ [propput, hidden, restricted, id(dispid_CustomCompositor)] HRESULT _CustomCompositor([in] IVMRImageCompositor* Compositor);
+ //
+ [propget, id(dispidMixerBitmap)] HRESULT MixerBitmap([out,retval] IPictureDisp** MixerPictureDisp);
+ [propget, hidden, restricted, id(dispid_MixerBitmap)] HRESULT _MixerBitmap([out, retval] IVMRMixerBitmap ** MixerPicture);
+ [propput, id(dispidMixerBitmap)] HRESULT MixerBitmap([in] IPictureDisp* MixerPictureDisp);
+ [propput, hidden, restricted, id(dispid_MixerBitmap)] HRESULT _MixerBitmap([in] VMRALPHABITMAP * MixerPicture);
+ [propget, id(dispidMixerBitmapRect)] HRESULT MixerBitmapPositionRect([out,retval] IMSVidRect **rDest);
+ [propput, id(dispidMixerBitmapRect)] HRESULT MixerBitmapPositionRect([in] IMSVidRect *rDest);
+ [propget, id(dispidMixerBitmapOpacity)] HRESULT MixerBitmapOpacity([out,retval]int *opacity);
+ [propput, id(dispidMixerBitmapOpacity)] HRESULT MixerBitmapOpacity([in]int opacity);
+ [id(dispidSetupMixerBitmap)] HRESULT SetupMixerBitmap([in] IPictureDisp * MixerPictureDisp, [in] long Opacity, [in] IMSVidRect *rDest);
+
+ // display surface control
+ [propget, id(dispidSourceSize)] HRESULT SourceSize([retval, out] SourceSizeList *CurrentSize);
+ [propput, id(dispidSourceSize)] HRESULT SourceSize([in] SourceSizeList NewSize);
+
+ [propget, id(dispidDevOverScan), helpstring("trim each source edge by this amount(in hundredths of percent, e.g. 1.75% == 175)")] HRESULT OverScan([retval, out] long *plPercent);
+ [propput, id(dispidDevOverScan), helpstring("trim each source edge by this amount(in hundredths of percent, e.g. 1.75% == 175)")] HRESULT OverScan([in] long lPercent);
+
+ [propget, id(dispidAvailableSourceRect)] HRESULT AvailableSourceRect([out, retval] IMSVidRect **pRect);
+ [propget, id(dispidMaxVidRect)] HRESULT MaxVidRect([out, retval] IMSVidRect **ppVidRect);
+ [propget, id(dispidMinVidRect)] HRESULT MinVidRect([out, retval] IMSVidRect **ppVidRect);
+ [propget, id(dispidClippedSourceRect)] HRESULT ClippedSourceRect([out, retval] IMSVidRect **pRect);
+ [propput, id(dispidClippedSourceRect)] HRESULT ClippedSourceRect([in] IMSVidRect *pRect);
+ [propget, id(dispidUsingOverlay)] HRESULT UsingOverlay([out, retval] VARIANT_BOOL *UseOverlayVal);
+ [propput, id(dispidUsingOverlay)] HRESULT UsingOverlay([in] VARIANT_BOOL UseOverlayVal);
+ [id(dispidCapture)] HRESULT Capture([out, retval] IPictureDisp **currentImage);
+ [propget, id(dispid_FramesPerSecond), helpstring("FramesPerSecond")] HRESULT FramesPerSecond([out, retval] long *pVal);
+ [propget, id(dispid_DecimateInput), helpstring("DecimateInput")] HRESULT DecimateInput([out,retval] VARIANT_BOOL *pDeci);
+ [propput, id(dispid_DecimateInput), helpstring("DecimateInput")] HRESULT DecimateInput([in] VARIANT_BOOL pDeci);
+
+ // Methods
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(37B03545-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Video Renderer Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVideoRendererEvent : IMSVidOutputDeviceEvent {
+ [id(eventidOverlayUnavailable), helpstring("HW Overlay surface in use or not present")] HRESULT OverlayUnavailable();
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Stream Buffer
+// Sink and Source
+//
+///////////////////////////////////////////////////////////////////////////////
+////
+// Stream Buffer Recording Control Object
+ //////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ dual,
+ oleautomation,
+ hidden,
+ nonextensible,
+ pointer_default(unique),
+ uuid(160621AA-BBBC-4326-A824-C395AEBC6E74),
+ helpstring("IMSVidStreamBufferRecordingControl Interface"),
+ ]
+ interface IMSVidStreamBufferRecordingControl : IDispatch {
+ [propget, id(dispidstarttime), helpstring("method StartTime, values in milliseconds")]HRESULT StartTime ([out, retval] long *rtStart) ;
+ [propput, id(dispidstarttime), helpstring("method StartTime, values in milliseconds")]HRESULT StartTime ([in] long rtStart) ;
+ [propget, id(dispidstoptime), helpstring("method StopTime, values in milliseconds")]HRESULT StopTime ([out, retval] long *rtStop) ;
+ [propput, id(dispidstoptime), helpstring("method StopTime, values in milliseconds")]HRESULT StopTime ([in] long rtStop) ;
+ [propget, id(dispidrecordingstopped), helpstring("method RecordingStopped")]HRESULT RecordingStopped ([out, retval] VARIANT_BOOL* phResult) ;
+ [propget, id(dispidrecordingstarted), helpstring("method RecordingStarted")]HRESULT RecordingStarted ([out, retval] VARIANT_BOOL* phResult);
+ [propget, id(dispidrecordingtype), helpstring("property returns type of recording object")] HRESULT RecordingType ([out, retval] RecordingType *dwType);
+ [propget, id(dispidRecordingAttribute), helpstring("get Recording Attribute interface")] HRESULT RecordingAttribute ([out, retval] IUnknown **pRecordingAttribute);
+ };
+ // Sink
+ [object, dual, oleautomation, hidden,
+ uuid(159DBB45-CD1B-4dab-83EA-5CB1F4F21D07),
+ helpstring("MS Video Control Stream Buffer Sink Output Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidStreamBufferSink : IMSVidOutputDevice {
+ [propget, id(dispidStreamBufferContentRecording), helpstring("New Recording Object")] HRESULT ContentRecorder([in]BSTR pszFilename, [retval, out] IMSVidStreamBufferRecordingControl ** pRecordingIUnknown ) ;
+ [propget, id(dispidStreamBufferReferenceRecording), helpstring("New Recording Object")] HRESULT ReferenceRecorder([in]BSTR pszFilename, [retval, out] IMSVidStreamBufferRecordingControl ** pRecordingIUnknown ) ;
+ [propget, id(dispidStreamBufferSinkName), helpstring("Sink Name")] HRESULT SinkName([retval, out] BSTR* pName);
+ [propput, id(dispidStreamBufferSinkName), helpstring("Sink Name")] HRESULT SinkName([in] BSTR Name);
+ [id(dispidNameSetLock), helpstring("Name Set Lock")] HRESULT NameSetLock();
+ [propget, id(dispidSBEConfigure), helpstring("SBE Sink Interface")] HRESULT SBESink([retval, out] IUnknown** sbeConfig);
+
+ };
+ ///////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(F798A36B-B05B-4bbe-9703-EAEA7D61CD51),
+ helpstring("MS Video Control Stream Buffer Sink Output Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidStreamBufferSinkEvent : IMSVidOutputDeviceEvent {
+ [id(eventidSinkCertificateFailure), helpstring("Sink Certificate Failure")] HRESULT CertificateFailure();
+ [id(eventidSinkCertificateSuccess), helpstring("Sink Certificate Success")] HRESULT CertificateSuccess();
+ [id(eventidWriteFailure), helpstring("Sink Write Failure")] HRESULT WriteFailure();
+ };
+///////////////////////////////////////////////////////////////////////////////////////
+// SBE Source Playback
+ [object, dual, oleautomation, hidden,
+ uuid(EB0C8CF9-6950-4772-87B1-47D11CF3A02F),
+ helpstring("MS Video Control Stream Buffer Source Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidStreamBufferSource : IMSVidFilePlayback {
+ [propget, id(dispidstart), helpstring("Start")] HRESULT Start([out, retval] long *lStart);
+ [propget, id(dispid_RecordingAttribute), helpstring("get Recording Attribute interface")] HRESULT RecordingAttribute ([out, retval] IUnknown **pRecordingAttribute);
+ [id(dispid_CurrentRatings), helpstring("Current Ratings for SBE playback")] HRESULT CurrentRatings([out] EnTvRat_System *pEnSystem, [out] EnTvRat_GenericLevel *pEnRating, [out] LONG *pBfEnAttr); // attrs are bitfields of BfEnTvRat_GenericAttributes
+ [id(dispid_MaxRatingsLevel), helpstring("Maximum Ratings Level for SBE playback")] HRESULT MaxRatingsLevel([in] EnTvRat_System enSystem, [in] EnTvRat_GenericLevel enRating, [in] LONG lbfEnAttr);
+ [propput, id(dispid_BlockUnrated), helpstring("Block unrated content")] HRESULT BlockUnrated([in] VARIANT_BOOL bBlock);
+ [propput, id(dispid_UnratedDelay), helpstring("Maximum Ratings Level for SBE playback")] HRESULT UnratedDelay([in] long dwDelay);
+ [propget, id(dispidsbesource), helpstring("Stream Buffer Source Interface")] HRESULT SBESource([out, retval] IUnknown **sbeFilter);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(50CE8A7D-9C28-4DA8-9042-CDFA7116F979),
+ helpstring("MS Video Control Stream Buffer Source Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidStreamBufferSourceEvent : IMSVidFilePlaybackEvent {
+ [id(eventidSourceCertificateFailure), helpstring("Source Certificate Failure")] HRESULT CertificateFailure();
+ [id(eventidSourceCertificateSuccess), helpstring("Source Certificate Success")] HRESULT CertificateSuccess();
+ [id(eventidRatingsBlocked), helpstring("Ratings Blocked")] HRESULT RatingsBlocked();
+ [id(eventidRatingsUnlocked), helpstring("Ratings Unblocked")] HRESULT RatingsUnblocked();
+ [id(eventidRatingsChanged), helpstring("Ratings Changed")] HRESULT RatingsChanged();
+ [id(eventidTimeHole), helpstring("Source Time Hole")] HRESULT TimeHole([in] long StreamOffsetMS, [in] long SizeMS);
+ [id(eventidStaleDataRead), helpstring("Source Stale Data Read")] HRESULT StaleDataRead();
+ [id(eventidContentBecomingStale), helpstring("Source Content Becoming Stale")] HRESULT ContentBecomingStale();
+ [id(eventidStaleFileDeleted), helpstring("Source Stale File Deleted")] HRESULT StaleFileDeleted();
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// video renderer II
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ [object, dual, oleautomation, hidden,
+ uuid(6BDD5C1E-2810-4159-94BC-05511AE8549B),
+ helpstring("MS Video Control Video Renderer Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVideoRenderer2 : IMSVidVideoRenderer {
+ // Properties
+ [propget, id(dispidAlloctor)] HRESULT Allocator([out, retval] IUnknown ** AllocPresent);
+ [propget, id(dispid_Allocator), hidden, restricted] HRESULT _Allocator([out, retval] IVMRSurfaceAllocator ** AllocPresent);
+ // Quick Notes on ID's
+ // 1. default id is the lower 32 bits of the IUnknown pointer for the Vidctl
+ // 2. if the id is not yet set get_Allocator_ID will return -1
+ [propget, id(dispidAllocPresentID)] HRESULT Allocator_ID([out, retval] long *ID);
+ [id(dispidSetAllocator)] HRESULT SetAllocator([in] IUnknown* AllocPresent, [in, defaultvalue(-1)] long ID);
+ [id(dispid_SetAllocator), hidden, restricted] HRESULT _SetAllocator([in] IVMRSurfaceAllocator* AllocPresent, [in, defaultvalue(-1)] long ID);
+ [propput, id(dispid_SuppressEffects)] HRESULT SuppressEffects( [in] VARIANT_BOOL bSuppress);
+ [propget, id(dispid_SuppressEffects)] HRESULT SuppressEffects( [out, retval] VARIANT_BOOL *bSuppress);
+ // display surface control
+ // Methods
+
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(7145ED66-4730-4fdb-8A53-FDE7508D3E5E),
+ helpstring("MS Video Control Video Renderer Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVideoRendererEvent2 : IMSVidOutputDeviceEvent {
+ [id(eventidOverlayUnavailable), helpstring("HW Overlay surface in use or not present")] HRESULT OverlayUnavailable();
+ };
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// audio renderer
+//
+///////////////////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, dual, oleautomation, hidden,
+ uuid(37B0353F-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Audio Renderer Device Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidAudioRenderer : IMSVidOutputDevice {
+ [propput, id(dispidDevVolume)] HRESULT Volume([in] long lVol);
+ [propget, id(dispidDevVolume)] HRESULT Volume([retval, out] long *lVol);
+ [propput, id(dispidDevBalance)] HRESULT Balance([in] long lBal);
+ [propget, id(dispidDevBalance)] HRESULT Balance([retval, out] long *lBal);
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////////////
+ [object, oleautomation, hidden,
+ uuid(37B03541-A4C8-11d2-B634-00C04F79498E),
+ helpstring("MS Video Control Audio Renderer Device Event Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidAudioRendererEvent : IMSVidOutputDeviceEvent {
+ };
+
+///////////////////////////////////////////////////////////////////////////////////////
+// device collection
+///////////////////////////////////////////////////////////////////////////////////////
+
+ [object, dual, oleautomation, hidden,
+ uuid(C5702CD1-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Input Device Writable Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidInputDevices : IDispatch {
+ [propget, id(dispidCount)] HRESULT Count([out, retval] long *lCount);
+ [propget, id(DISPID_NEWENUM), hidden, restricted] HRESULT _NewEnum([out, retval] IEnumVARIANT **pD);
+ [propget, id(DISPID_VALUE)] HRESULT Item([in] VARIANT v, [out, retval] IMSVidInputDevice **pDB);
+ [id(DISPID_ADDITEM)] HRESULT Add([in] IMSVidInputDevice *pDB);
+ [id(DISPID_REMOVEITEM)] HRESULT Remove([in] VARIANT v);
+ };
+
+ [object, dual, oleautomation, hidden,
+ uuid(C5702CD2-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Output Device Writable Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidOutputDevices : IDispatch {
+ [propget, id(dispidCount)] HRESULT Count([out, retval] long *lCount);
+ [propget, id(DISPID_NEWENUM), hidden, restricted] HRESULT _NewEnum([out, retval] IEnumVARIANT **pD);
+ [propget, id(DISPID_VALUE)] HRESULT Item([in] VARIANT v, [out, retval] IMSVidOutputDevice **pDB);
+ [id(DISPID_ADDITEM)] HRESULT Add([in] IMSVidOutputDevice *pDB);
+ [id(DISPID_REMOVEITEM)] HRESULT Remove([in] VARIANT v);
+ };
+
+ [object, dual, oleautomation, hidden,
+ uuid(C5702CD3-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Video Renderer Device Writable Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidVideoRendererDevices : IDispatch {
+ [propget, id(dispidCount)] HRESULT Count([out, retval] long *lCount);
+ [propget, id(DISPID_NEWENUM), hidden, restricted] HRESULT _NewEnum([out, retval] IEnumVARIANT **pD);
+ [propget, id(DISPID_VALUE)] HRESULT Item([in] VARIANT v, [out, retval] IMSVidVideoRenderer **pDB);
+ [id(DISPID_ADDITEM)] HRESULT Add([in] IMSVidVideoRenderer *pDB);
+ [id(DISPID_REMOVEITEM)] HRESULT Remove([in] VARIANT v);
+ };
+
+ [object, dual, oleautomation, hidden,
+ uuid(C5702CD4-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Audio Renderer Device Writable Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidAudioRendererDevices : IDispatch {
+ [propget, id(dispidCount)] HRESULT Count([out, retval] long *lCount);
+ [propget, id(DISPID_NEWENUM), hidden, restricted] HRESULT _NewEnum([out, retval] IEnumVARIANT **pD);
+ [propget, id(DISPID_VALUE)] HRESULT Item([in] VARIANT v, [out, retval] IMSVidAudioRenderer **pDB);
+ [id(DISPID_ADDITEM)] HRESULT Add([in] IMSVidAudioRenderer *pDB);
+ [id(DISPID_REMOVEITEM)] HRESULT Remove([in] VARIANT v);
+ };
+
+ [object, dual, oleautomation, hidden,
+ uuid(C5702CD5-9B79-11d3-B654-00C04F79498E),
+ helpstring("MS Video Control Features Writable Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IMSVidFeatures: IDispatch {
+ [propget, id(dispidCount)] HRESULT Count([out, retval] long *lCount);
+ [propget, id(DISPID_NEWENUM), hidden, restricted] HRESULT _NewEnum([out, retval] IEnumVARIANT **pD);
+ [propget, id(DISPID_VALUE)] HRESULT Item([in] VARIANT v, [out, retval] IMSVidFeature **pDB);
+ [id(DISPID_ADDITEM)] HRESULT Add([in] IMSVidFeature *pDB);
+ [id(DISPID_REMOVEITEM)] HRESULT Remove([in] VARIANT v);
+ };
+
+#endif // TUNING_MODEL_ONLY
+
+// end of file segment.idl
diff --git a/dxsdk/Include/DShowIDL/Videoacc.idl b/dxsdk/Include/DShowIDL/Videoacc.idl
new file mode 100644
index 00000000..6c55aa73
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Videoacc.idl
@@ -0,0 +1,172 @@
+//------------------------------------------------------------------------------
+// File: VideoAcc.idl
+//
+// Desc: An interface exposed by the overlay mixer to help decode samples
+// using hardware video acceleration.
+//
+// Copyright (c) 1992-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+
+cpp_quote("//")
+cpp_quote("// The following declarations within the 'if 0' block are dummy typedefs used to make")
+cpp_quote("// the motncomp.idl file build. The actual definitions are contained in ddraw.h and amva.h")
+cpp_quote("//")
+cpp_quote("#if 0")
+
+typedef void* LPVOID;
+typedef void* LPGUID;
+typedef void* LPDIRECTDRAWSURFACE;
+typedef void* LPDDPIXELFORMAT;
+typedef void* LPAMVAInternalMemInfo;
+typedef void AMVAUncompDataInfo;
+typedef void* LPAMVACompBufferInfo;
+typedef void AMVABUFFERINFO;
+typedef void AMVAEndFrameInfo;
+typedef void* LPAMVAUncompBufferInfo;
+typedef void AMVABeginFrameInfo;
+typedef IUnknown* IMediaSample;
+
+cpp_quote("#endif")
+cpp_quote("#include <ddraw.h>")
+cpp_quote("#include <amva.h>")
+
+
+[
+ local,
+ object,
+ uuid(256A6A21-FBAD-11d1-82BF-00A0C9696C8F),
+ helpstring("IAMVideoAcceleratorNotify Interface"),
+ pointer_default(unique)
+]
+
+// IAMVideoAcceleratorNotify
+interface IAMVideoAcceleratorNotify : IUnknown
+{
+ // get information necessary to allocate uncompressed data buffers
+ // which is not part of the mediatype format (like how many buffers to allocate etc)
+ HRESULT GetUncompSurfacesInfo([in] const GUID *pGuid, [in] [out] LPAMVAUncompBufferInfo pUncompBufferInfo);
+
+ // set information regarding allocated uncompressed data buffers
+ HRESULT SetUncompSurfacesInfo([in] DWORD dwActualUncompSurfacesAllocated);
+
+ // get information necessary to create video accelerator object. It is the caller's responsibility
+ // to call CoTaskMemFree() on *ppMiscData
+ HRESULT GetCreateVideoAcceleratorData([in] const GUID *pGuid, [out] LPDWORD pdwSizeMiscData, [out] LPVOID *ppMiscData);
+};
+
+[
+ local,
+ object,
+ uuid(256A6A22-FBAD-11d1-82BF-00A0C9696C8F),
+ helpstring("IAMVideoAccelerator Interface"),
+ pointer_default(unique)
+]
+
+// IAMVideoAccelerator
+interface IAMVideoAccelerator : IUnknown
+{
+ // pdwNumGuidsSupported is an IN OUT paramter
+ // pGuidsSupported is an IN OUT paramter
+ // if pGuidsSupported is NULL, pdwNumGuidsSupported should return back with the
+ // number of uncompressed pixel formats supported
+ // Otherwise pGuidsSupported is an array of *pdwNumGuidsSupported structures
+ HRESULT GetVideoAcceleratorGUIDs([in] [out] LPDWORD pdwNumGuidsSupported, [in] [out] LPGUID pGuidsSupported);
+
+ // pGuid is an IN parameter
+ // pdwNumFormatsSupported is an IN OUT paramter
+ // pFormatsSupported is an IN OUT paramter (caller should make sure to set the size of EACH struct)
+ // if pFormatsSupported is NULL, pdwNumFormatsSupported should return back with
+ // the number of uncompressed pixel formats supported
+ // Otherwise pFormatsSupported is an array of *pdwNumFormatsSupported structures
+ HRESULT GetUncompFormatsSupported( [in] const GUID *pGuid, [in] [out] LPDWORD pdwNumFormatsSupported,
+ [in] [out] LPDDPIXELFORMAT pFormatsSupported);
+
+ // pGuid is an IN parameter
+ // pamvaUncompDataInfo is an IN parameter
+ // pamvaInternalMemInfo is an IN OUT parameter (caller should make sure to set the size of struct)
+ // currently only gets info about how much scratch memory will the hal allocate for its private use
+ HRESULT GetInternalMemInfo([in] const GUID *pGuid, [in] const AMVAUncompDataInfo *pamvaUncompDataInfo,
+ [in] [out] LPAMVAInternalMemInfo pamvaInternalMemInfo);
+
+ // pGuid is an IN parameter
+ // pamvaUncompDataInfo is an IN parameter
+ // pdwNumTypesCompBuffers is an IN OUT paramter
+ // pamvaCompBufferInfo is an IN OUT paramter (caller should make sure to set the size of EACH struct)
+ // if pamvaCompBufferInfo is NULL, pdwNumTypesCompBuffers should return back with the number of types of
+ // compressed buffers
+ // Otherwise pamvaCompBufferInfo is an array of *pdwNumTypesCompBuffers structures
+ HRESULT GetCompBufferInfo([in] const GUID *pGuid, [in] const AMVAUncompDataInfo *pamvaUncompDataInfo,
+ [in] [out] LPDWORD pdwNumTypesCompBuffers, [out] LPAMVACompBufferInfo pamvaCompBufferInfo);
+
+
+ // pdwNumTypesCompBuffers is an IN OUT paramter
+ // pamvaCompBufferInfo is an IN OUT paramter (caller should make sure to set the size of EACH struct)
+ // if pamvaCompBufferInfo is NULL, pdwNumTypesCompBuffers should return back with the number of types of
+ // compressed buffers
+ // Otherwise pamvaCompBufferInfo is an array of *pdwNumTypesCompBuffers structures
+ // only valid to call this after the pins are connected
+ HRESULT GetInternalCompBufferInfo([in] [out] LPDWORD pdwNumTypesCompBuffers, [out] LPAMVACompBufferInfo pamvaCompBufferInfo);
+
+ // begin a frame, the pMiscData is passed directly to the hal
+ // only valid to call this after the pins are connected
+ // Tells the ovmixer which frame is the destination
+ // frame. Use indices (valid vales are [0 .. pdwNumSurfacesAllocated-1]) to specify frames
+ HRESULT BeginFrame([in] const AMVABeginFrameInfo *amvaBeginFrameInfo);
+
+ // end a frame, the pMiscData is passed directly to the hal
+ // only valid to call this after the pins are connected
+ HRESULT EndFrame([in] const AMVAEndFrameInfo *pEndFrameInfo);
+
+ // lock and obtain access to a single buffer
+ // only valid to call this after the pins are connected
+ // Buffers are identified by type and index within that type
+ // Specifiying read-only will allow access to busy reference
+ // frames
+ // Output (uncompressed) frames use a type index of 0xFFFFFFFF
+ HRESULT GetBuffer(
+ [in] DWORD dwTypeIndex,
+ [in] DWORD dwBufferIndex,
+ [in] BOOL bReadOnly,
+ [out] LPVOID *ppBuffer,
+ [out] LONG *lpStride);
+
+ // unlock a single buffer
+ // Buffers are identified by type and index within that type
+ // only valid to call this after the pins are connected
+ HRESULT ReleaseBuffer([in] DWORD dwTypeIndex, [in] DWORD dwBufferIndex);
+
+ // Perform a decompression operation
+ // Private data can be passed to and from a driver
+ // identifiers for the corresponding members of pamvaMacroBlockInfo
+ // pamvaMacroBlockInfo is an IN parameter which is array (of length dwNumBlocks) of structures
+ // only valid to call this after the pins are connected
+ HRESULT Execute(
+ [in] DWORD dwFunction,
+ [in] LPVOID lpPrivateInputData,
+ [in] DWORD cbPrivateInputData,
+ [in] LPVOID lpPrivateOutputDat,
+ [in] DWORD cbPrivateOutputData,
+ [in] DWORD dwNumBuffers,
+ [in] const AMVABUFFERINFO *pamvaBufferInfo);
+
+ // query the decode status of a particular decompression operation
+ // dwTypeIndex and dwBufferIndex define the buffer whose status is
+ // being queried
+ HRESULT QueryRenderStatus([in] DWORD dwTypeIndex,
+ [in] DWORD dwBufferIndex,
+ [in] DWORD dwFlags);
+
+ // display a frame. The mediasample contains the timestamps etc for the frame to be displayed
+ // this call is a non-blocking call
+ // only valid to call this after the pins are connected
+ HRESULT DisplayFrame([in] DWORD dwFlipToIndex, [in] IMediaSample *pMediaSample);
+};
+
+
+
+
+
+
diff --git a/dxsdk/Include/DShowIDL/Vmrender.idl b/dxsdk/Include/DShowIDL/Vmrender.idl
new file mode 100644
index 00000000..ed5e50ec
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/Vmrender.idl
@@ -0,0 +1,1092 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Public Interfaces for the Video Mixing Renderer DShow filter
+//
+// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
+///////////////////////////////////////////////////////////////////////////////
+
+cpp_quote("#if 0")
+// This is temporary work around to persuade
+// MIDL to allow forward declarations.
+typedef DWORD* LPDIRECTDRAW7;
+typedef DWORD* LPDIRECTDRAWSURFACE7;
+typedef DWORD* LPDDPIXELFORMAT;
+typedef DWORD* LPBITMAPINFOHEADER;
+typedef struct {DWORD dw1; DWORD dw2;} DDCOLORKEY;
+typedef DDCOLORKEY* LPDDCOLORKEY;
+cpp_quote ("#endif")
+cpp_quote("#include <ddraw.h>")
+
+
+// public interfaces supported by the VMR
+interface IVMRSurface;
+
+interface IVMRSurfaceAllocator;
+interface IVMRSurfaceAllocatorNotify;
+interface IVMRImagePresenter;
+interface IVMRImagePresenterConfig;
+
+interface IVMRWindowlessControl;
+interface IVMRMixerControl;
+interface IVMRMixerBitmap;
+interface IVMRFilterConfig;
+interface IVMRAspectRatioControl;
+interface IVMRDeinterlaceControl;
+interface IVMRMonitorConfig;
+
+interface IVMRImageCompositor;
+
+interface IVMRVideoStreamControl;
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Allocator Presenter interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+
+
+
+//=====================================================================
+//
+// IVMRImagePresenter
+//
+//=====================================================================
+typedef enum {
+ VMRSample_SyncPoint = 0x00000001,
+ VMRSample_Preroll = 0x00000002,
+ VMRSample_Discontinuity = 0x00000004,
+ VMRSample_TimeValid = 0x00000008,
+ VMRSample_SrcDstRectsValid= 0x00000010
+} VMRPresentationFlags;
+
+
+typedef struct tagVMRPRESENTATIONINFO {
+ DWORD dwFlags;
+ LPDIRECTDRAWSURFACE7 lpSurf;
+ REFERENCE_TIME rtStart;
+ REFERENCE_TIME rtEnd;
+ SIZE szAspectRatio;
+ RECT rcSrc;
+ RECT rcDst;
+ DWORD dwTypeSpecificFlags;
+ DWORD dwInterlaceFlags;
+} VMRPRESENTATIONINFO;
+
+[
+ local,
+ object,
+ local,
+ uuid(CE704FE7-E71E-41fb-BAA2-C4403E1182F5),
+ helpstring("IVMRImagePresenter Interface"),
+ pointer_default(unique)
+]
+interface IVMRImagePresenter : IUnknown
+{
+ HRESULT StartPresenting(
+ [in] DWORD_PTR dwUserID
+ );
+
+ HRESULT StopPresenting(
+ [in] DWORD_PTR dwUserID
+ );
+
+
+ HRESULT PresentImage(
+ [in] DWORD_PTR dwUserID,
+ [in] VMRPRESENTATIONINFO* lpPresInfo
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRSurfaceAllocator
+//
+//=====================================================================
+
+typedef enum {
+ AMAP_PIXELFORMAT_VALID = 0x01,
+ AMAP_3D_TARGET = 0x02,
+ AMAP_ALLOW_SYSMEM = 0x04,
+ AMAP_FORCE_SYSMEM = 0x08,
+ AMAP_DIRECTED_FLIP = 0x10,
+ AMAP_DXVA_TARGET = 0x20
+} VMRSurfaceAllocationFlags;
+
+typedef struct tagVMRALLOCATIONINFO {
+ DWORD dwFlags;
+ LPBITMAPINFOHEADER lpHdr;
+ LPDDPIXELFORMAT lpPixFmt;
+ SIZE szAspectRatio;
+ DWORD dwMinBuffers;
+ DWORD dwMaxBuffers;
+ DWORD dwInterlaceFlags;
+ SIZE szNativeSize;
+} VMRALLOCATIONINFO;
+
+[
+ local,
+ object,
+ local,
+ uuid(31ce832e-4484-458b-8cca-f4d7e3db0b52),
+ helpstring("IVMRSurfaceAllocator Interface"),
+ pointer_default(unique)
+]
+interface IVMRSurfaceAllocator : IUnknown
+{
+ HRESULT AllocateSurface(
+ [in] DWORD_PTR dwUserID,
+ [in] VMRALLOCATIONINFO* lpAllocInfo,
+ [in] [out] DWORD* lpdwActualBuffers,
+ [out] LPDIRECTDRAWSURFACE7 *lplpSurface
+ );
+
+ HRESULT FreeSurface(
+ [in] DWORD_PTR dwID
+ );
+
+ HRESULT PrepareSurface(
+ [in] DWORD_PTR dwUserID,
+ [in] LPDIRECTDRAWSURFACE7 lpSurface,
+ [in] DWORD dwSurfaceFlags
+ );
+
+ HRESULT AdviseNotify(
+ [in] IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRSurfaceAllocatorNotify
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(aada05a8-5a4e-4729-af0b-cea27aed51e2),
+ helpstring("IVMRSurfaceAllocatorNotify Interface"),
+ pointer_default(unique)
+]
+interface IVMRSurfaceAllocatorNotify : IUnknown
+{
+ HRESULT AdviseSurfaceAllocator(
+ [in] DWORD_PTR dwUserID,
+ [in] IVMRSurfaceAllocator* lpIVRMSurfaceAllocator
+ );
+
+ HRESULT SetDDrawDevice(
+ [in] LPDIRECTDRAW7 lpDDrawDevice,
+ [in] HMONITOR hMonitor
+ );
+
+ HRESULT ChangeDDrawDevice(
+ [in] LPDIRECTDRAW7 lpDDrawDevice,
+ [in] HMONITOR hMonitor
+ );
+
+ HRESULT RestoreDDrawSurfaces();
+
+ HRESULT NotifyEvent(
+ [in] LONG EventCode,
+ [in] LONG_PTR Param1,
+ [in] LONG_PTR Param2
+ );
+
+ HRESULT SetBorderColor(
+ [in] COLORREF clrBorder
+ );
+};
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Application control and configuration interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+
+
+//=====================================================================
+//
+// IVMRWindowlessControl
+//
+//=====================================================================
+typedef enum {
+ VMR_ARMODE_NONE,
+ VMR_ARMODE_LETTER_BOX
+} VMR_ASPECT_RATIO_MODE;
+
+[
+ local,
+ object,
+ local,
+ uuid(0eb1088c-4dcd-46f0-878f-39dae86a51b7),
+ helpstring("IVMRWindowlessControl Interface"),
+ pointer_default(unique)
+]
+interface IVMRWindowlessControl : IUnknown
+{
+ //
+ //////////////////////////////////////////////////////////
+ // Video size and position information
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT GetNativeVideoSize(
+ [out] LONG* lpWidth,
+ [out] LONG* lpHeight,
+ [out] LONG* lpARWidth,
+ [out] LONG* lpARHeight
+ );
+
+ HRESULT GetMinIdealVideoSize(
+ [out] LONG* lpWidth,
+ [out] LONG* lpHeight
+ );
+
+ HRESULT GetMaxIdealVideoSize(
+ [out] LONG* lpWidth,
+ [out] LONG* lpHeight
+ );
+
+ HRESULT SetVideoPosition(
+ [in] const LPRECT lpSRCRect,
+ [in] const LPRECT lpDSTRect
+ );
+
+ HRESULT GetVideoPosition(
+ [out] LPRECT lpSRCRect,
+ [out] LPRECT lpDSTRect
+ );
+
+ HRESULT GetAspectRatioMode(
+ [out] DWORD* lpAspectRatioMode
+ );
+
+ HRESULT SetAspectRatioMode(
+ [in] DWORD AspectRatioMode
+ );
+
+ //
+ //////////////////////////////////////////////////////////
+ // Display and clipping management
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT SetVideoClippingWindow(
+ [in] HWND hwnd
+ );
+
+ HRESULT RepaintVideo(
+ [in] HWND hwnd,
+ [in] HDC hdc
+ );
+
+ HRESULT DisplayModeChanged();
+
+
+ //
+ //////////////////////////////////////////////////////////
+ // GetCurrentImage
+ //
+ // Returns the current image being displayed. This images
+ // is returned in the form of packed Windows DIB.
+ //
+ // GetCurrentImage can be called at any time, also
+ // the caller is responsible for free the returned memory
+ // by calling CoTaskMemFree.
+ //
+ // Excessive use of this function will degrade video
+ // playback performed.
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT GetCurrentImage(
+ [out] BYTE** lpDib
+ );
+
+ //
+ //////////////////////////////////////////////////////////
+ // Border Color control
+ //
+ // The border color is color used to fill any area of the
+ // the destination rectangle that does not contain video.
+ // It is typically used in two instances. When the video
+ // straddles two monitors and when the VMR is trying
+ // to maintain the aspect ratio of the movies by letter
+ // boxing the video to fit within the specified destination
+ // rectangle. See SetAspectRatioMode above.
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT SetBorderColor(
+ [in] COLORREF Clr
+ );
+
+ HRESULT GetBorderColor(
+ [out] COLORREF* lpClr
+ );
+
+ //
+ //////////////////////////////////////////////////////////
+ // Color key control only meaningful when the VMR is using
+ // and overlay
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT SetColorKey(
+ [in] COLORREF Clr
+ );
+
+ HRESULT GetColorKey(
+ [out] COLORREF* lpClr
+ );
+};
+
+
+
+//=====================================================================
+//
+// IVMRMixerControl
+//
+//=====================================================================
+
+typedef enum {
+ MixerPref_NoDecimation = 0x00000001, // No decimation - full size
+ MixerPref_DecimateOutput = 0x00000002, // decimate output by 2 in x & y
+ MixerPref_ARAdjustXorY = 0x00000004, // adjust the aspect ratio in x or y
+ MixerPref_DecimationReserved = 0x00000008, // bits reserved for future use.
+ MixerPref_DecimateMask = 0x0000000F,
+
+ MixerPref_BiLinearFiltering = 0x00000010, // use bi-linear filtering
+ MixerPref_PointFiltering = 0x00000020, // use point filtering
+ MixerPref_FilteringMask = 0x000000F0, // OR of all above flags
+
+ MixerPref_RenderTargetRGB = 0x00000100, // Uses D3D to perform mixing
+ MixerPref_RenderTargetYUV = 0x00001000, // Uses DXVA to perform mixing
+
+ MixerPref_RenderTargetYUV420 = 0x00000200, // Deprecated render target
+ MixerPref_RenderTargetYUV422 = 0x00000400, // Deprecated render target
+ MixerPref_RenderTargetYUV444 = 0x00000800, // Deprecated render target
+ MixerPref_RenderTargetReserved = 0x0000E000, // 3 bits reserved for future use.
+ MixerPref_RenderTargetMask = 0x0000FF00, // OR of all above flags
+
+ //
+ // Dynamic changes that can be performed when the VMR's mixer is
+ // configured to use the YUV Render target (see MixerPref_RenderTargetYUV)
+ // These preferences can be applied while the graph is running and take effect
+ // when the next frame is composed by the mixer.
+ //
+ MixerPref_DynamicSwitchToBOB = 0x00010000,
+ MixerPref_DynamicDecimateBy2 = 0x00020000,
+
+ MixerPref_DynamicReserved = 0x000C0000,
+ MixerPref_DynamicMask = 0x000F0000
+
+} VMRMixerPrefs;
+
+//
+// Normalized relative rectangle
+// Coordinate ranges: x=[0...1) y=[0...1)
+// Where the output window goes from 0,0 (closed inclusive lower bound)
+// to 1,1 (open exclusive upper bound)
+//
+typedef struct _NORMALIZEDRECT
+{
+ float left;
+ float top;
+ float right;
+ float bottom;
+} NORMALIZEDRECT, *PNORMALIZEDRECT;
+
+[
+ local,
+ object,
+ local,
+ uuid(1c1a17b0-bed0-415d-974b-dc6696131599),
+ helpstring("IVMRMixerControl Interface"),
+ pointer_default(unique)
+]
+interface IVMRMixerControl : IUnknown
+{
+ HRESULT SetAlpha(
+ [in] DWORD dwStreamID,
+ [in] float Alpha // Source alpha premultication factor (global alpha for source)
+ );
+
+ HRESULT GetAlpha(
+ [in] DWORD dwStreamID,
+ [out] float* pAlpha
+ );
+
+ HRESULT SetZOrder(
+ [in] DWORD dwStreamID,
+ [in] DWORD dwZ
+ );
+
+ HRESULT GetZOrder(
+ [in] DWORD dwStreamID,
+ [out] DWORD* pZ
+ );
+
+ HRESULT SetOutputRect(
+ [in] DWORD dwStreamID,
+ [in] const NORMALIZEDRECT *pRect
+ );
+
+ HRESULT GetOutputRect(
+ [in] DWORD dwStreamID,
+ [out] NORMALIZEDRECT *pRect
+ );
+
+ HRESULT SetBackgroundClr(
+ [in] COLORREF ClrBkg
+ );
+
+ HRESULT GetBackgroundClr(
+ [in] COLORREF* lpClrBkg
+ );
+
+ HRESULT SetMixingPrefs(
+ [in] DWORD dwMixerPrefs // a combination of VMRMixingPrefFlags
+ );
+
+ HRESULT GetMixingPrefs(
+ [out] DWORD* pdwMixerPrefs
+ );
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// VMR Multimon configuration interface
+//
+///////////////////////////////////////////////////////////////////////////////
+typedef struct tagVMRGUID {
+ GUID* pGUID; // is NULL if the default DDraw device
+ GUID GUID; // otherwise points to this GUID
+} VMRGUID;
+
+#define VMRDEVICENAMELEN 32
+#define VMRDEVICEDESCRIPTIONLEN 256
+
+typedef struct tagVMRMONITORINFO {
+ VMRGUID guid;
+ RECT rcMonitor;
+ HMONITOR hMon;
+ DWORD dwFlags; // described in MONITORINFOEX, currently only MONITORINFOF_PRIMARY
+ wchar_t szDevice[VMRDEVICENAMELEN];
+ wchar_t szDescription[VMRDEVICEDESCRIPTIONLEN];
+ LARGE_INTEGER liDriverVersion;
+ DWORD dwVendorId;
+ DWORD dwDeviceId;
+ DWORD dwSubSysId;
+ DWORD dwRevision;
+ // find out the DDCAPS using DDrawCreate on the monitor GUID
+} VMRMONITORINFO;
+
+[
+ object,
+ local,
+ uuid(9cf0b1b6-fbaa-4b7f-88cf-cf1f130a0dce),
+ helpstring("IVMRMonitorConfig Interface"),
+ pointer_default(unique)
+]
+interface IVMRMonitorConfig : IUnknown
+{
+ // Use this method on a Multi-Monitor system to specify to the
+ // mixer filter which Direct Draw driver should be used when connecting
+ // to an upstream decoder filter.
+ //
+ HRESULT SetMonitor(
+ [in] const VMRGUID *pGUID
+ );
+
+ // Use this method to determine the direct draw object that will be used when
+ // connecting the mixer filter to an upstream decoder filter.
+ //
+ HRESULT GetMonitor(
+ [out] VMRGUID *pGUID
+ );
+
+ // Use this method on a multi-monitor system to specify to the
+ // mixer filter the default Direct Draw device to use when
+ // connecting to an upstream filter. The default direct draw device
+ // can be overriden for a particular connection by SetMonitor method
+ // described above.
+ //
+ HRESULT SetDefaultMonitor(
+ [in] const VMRGUID *pGUID
+ );
+
+ // Use this method on a multi-monitor system to determine which
+ // is the default direct draw device the overlay mixer filter
+ // will use when connecting to an upstream filter.
+ //
+ HRESULT GetDefaultMonitor(
+ [out] VMRGUID *pGUID
+ );
+
+ // Use this method to get a list of Direct Draw device GUIDs and thier
+ // associated monitor information that the mixer can use when
+ // connecting to an upstream decoder filter. Passing down a NULL pInfo
+ // parameter allows the app to determine the required array size (returned
+ // in pdwNumDevices). Otherwise, dwNumDevices returns the actual
+ // number of devices retrieved.
+ //
+ HRESULT GetAvailableMonitors(
+ [out, size_is(dwMaxInfoArraySize)] VMRMONITORINFO* pInfo,
+ [in] DWORD dwMaxInfoArraySize, // in array members
+ [out] DWORD* pdwNumDevices // actual number of devices retrieved
+ );
+};
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// VMR Filter configuration interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+
+
+typedef enum {
+ RenderPrefs_RestrictToInitialMonitor = 0x00000000, // not implemented do not use
+ RenderPrefs_ForceOffscreen = 0x00000001,
+ RenderPrefs_ForceOverlays = 0x00000002, // fail if no overlays
+ RenderPrefs_AllowOverlays = 0x00000000, // overlay used by default
+ RenderPrefs_AllowOffscreen = 0x00000000, // offscreen used if no overlay
+ RenderPrefs_DoNotRenderColorKeyAndBorder = 0x00000008, // app paints color keys
+ RenderPrefs_Reserved = 0x00000010, // note: used to be RestrictToInitialMonitor
+ RenderPrefs_PreferAGPMemWhenMixing = 0x00000020, // try agp mem when allocating textures
+
+ RenderPrefs_Mask = 0x0000003f, // OR of all above flags
+} VMRRenderPrefs;
+
+typedef enum {
+ VMRMode_Windowed = 0x00000001,
+ VMRMode_Windowless = 0x00000002,
+ VMRMode_Renderless = 0x00000004,
+
+ // not a valid value to pass to SetRenderMode
+ VMRMode_Mask = 0x00000007, // OR of all above flags
+} VMRMode;
+
+enum {
+ MAX_NUMBER_OF_STREAMS = 16
+};
+
+[
+ object,
+ local,
+ uuid(9e5530c5-7034-48b4-bb46-0b8a6efc8e36),
+ helpstring("IVMRFilterConfig Interface"),
+ pointer_default(unique)
+]
+interface IVMRFilterConfig : IUnknown
+{
+ HRESULT SetImageCompositor(
+ [in] IVMRImageCompositor* lpVMRImgCompositor
+ );
+
+ HRESULT SetNumberOfStreams(
+ [in] DWORD dwMaxStreams
+ );
+
+ HRESULT GetNumberOfStreams(
+ [out] DWORD* pdwMaxStreams
+ );
+
+ HRESULT SetRenderingPrefs(
+ [in] DWORD dwRenderFlags // a combination of VMRRenderingPrefFlags
+ );
+
+ HRESULT GetRenderingPrefs(
+ [out] DWORD* pdwRenderFlags
+ );
+
+ HRESULT SetRenderingMode(
+ [in] DWORD Mode // a combination of VMRMode
+ );
+
+ HRESULT GetRenderingMode(
+ [out] DWORD* pMode
+ );
+}
+
+
+//=====================================================================
+//
+// IVMRAspectRatioControl
+//
+//=====================================================================
+[
+ object,
+ local,
+ uuid(ede80b5c-bad6-4623-b537-65586c9f8dfd),
+ helpstring("IVMRAspectRatioControl Interface"),
+ pointer_default(unique)
+]
+interface IVMRAspectRatioControl : IUnknown
+{
+ HRESULT GetAspectRatioMode(
+ [out] LPDWORD lpdwARMode
+ );
+
+ HRESULT SetAspectRatioMode(
+ [in] DWORD dwARMode
+ );
+}
+
+
+//=====================================================================
+//
+// IVMRDeinterlaceControl
+//
+// New interfaced introduced into the WindowsXP SP1 release of the VMR.
+// This interface allows applications to control the DX-VA deinterlacing
+// support provided by the VMR.
+//
+// The VMR needs to be set into "mixing" mode for this interface to work.
+//
+// SetDeinterlaceMode is only effective for new connections made to the
+// VMR. It should be noted that the graphics device driver may refuse
+// to use the specified deinterlace mode, in which case 3 fallback
+// policies are offered by the VMR, these being:
+//
+// 1. Fallback to the next best mode offered by the driver.
+// 2. Fallback to the BOB deinterlace mode.
+// 3. Fallback to the WEAVE deinterlace mode (ie. turn deinterlacing off).
+//
+//=====================================================================
+
+typedef enum {
+ DeinterlacePref_NextBest = 0x01,
+ DeinterlacePref_BOB = 0x02,
+ DeinterlacePref_Weave = 0x04,
+ DeinterlacePref_Mask = 0x07
+} VMRDeinterlacePrefs;
+
+typedef enum {
+
+ // the algorithm is unknown or proprietary
+ DeinterlaceTech_Unknown = 0x0000,
+
+ // the algorithm creates the missing lines by repeating
+ // the line either above or below it - this method will look very jaggy and
+ // isn't recommended
+ DeinterlaceTech_BOBLineReplicate = 0x0001,
+
+
+ // the algorithm creates the missing lines by vertically stretching each
+ // video field by a factor of two, for example by averaging two lines or
+ // using a [-1, 9, 9, -1]/16 filter across four lines.
+ // Slight vertical adjustments are made to ensure that the resulting image
+ // does not "bob" up and down.
+ DeinterlaceTech_BOBVerticalStretch = 0x0002,
+
+ // the pixels in the missing line are recreated by a median filtering operation
+ DeinterlaceTech_MedianFiltering = 0x0004,
+
+ // the pixels in the missing line are recreated by an edge filter.
+ // In this process, spatial directional filters are applied to determine
+ // the orientation of edges in the picture content, and missing
+ // pixels are created by filtering along (rather than across) the
+ // detected edges.
+ DeinterlaceTech_EdgeFiltering = 0x0010,
+
+ // the pixels in the missing line are recreated by switching on a field by
+ // field basis between using either spatial or temporal interpolation
+ // depending on the amount of motion.
+ DeinterlaceTech_FieldAdaptive = 0x0020,
+
+ // the pixels in the missing line are recreated by switching on a pixel by pixel
+ // basis between using either spatial or temporal interpolation depending on
+ // the amount of motion..
+ DeinterlaceTech_PixelAdaptive = 0x0040,
+
+ // Motion Vector Steering identifies objects within a sequence of video
+ // fields. The missing pixels are recreated after first aligning the
+ // movement axes of the individual objects in the scene to make them
+ // parallel with the time axis.
+ DeinterlaceTech_MotionVectorSteered = 0x0080
+
+} VMRDeinterlaceTech;
+
+typedef struct _VMRFrequency {
+ DWORD dwNumerator;
+ DWORD dwDenominator;
+} VMRFrequency;
+
+typedef struct _VMRVideoDesc {
+ DWORD dwSize;
+ DWORD dwSampleWidth;
+ DWORD dwSampleHeight;
+ BOOL SingleFieldPerSample;
+ DWORD dwFourCC;
+ VMRFrequency InputSampleFreq;
+ VMRFrequency OutputFrameFreq;
+} VMRVideoDesc;
+
+typedef struct _VMRDeinterlaceCaps {
+ DWORD dwSize;
+ DWORD dwNumPreviousOutputFrames;
+ DWORD dwNumForwardRefSamples;
+ DWORD dwNumBackwardRefSamples;
+ VMRDeinterlaceTech DeinterlaceTechnology;
+} VMRDeinterlaceCaps;
+
+[
+ object,
+ local,
+ uuid(bb057577-0db8-4e6a-87a7-1a8c9a505a0f),
+ helpstring("IVMRDeinterlaceControl Interface"),
+ pointer_default(unique)
+]
+interface IVMRDeinterlaceControl : IUnknown
+{
+ //
+ // For the specified video description returns the
+ // number of deinterlacing modes available to the VMR.
+ // The deinterlacing modes are returned in descending
+ // quality order ie. the best quality mode is at
+ // lpdwNumDeinterlaceModes[0], the next best at
+ // lpdwNumDeinterlaceModes[1] and so on.
+ //
+ // To determine how big an array of guids to pass to the
+ // GetNumberOfDeinterlaceModes method call
+ // GetNumberOfDeinterlaceModes(lpVideoDescription, &dwNumModes, NULL);
+ //
+ HRESULT GetNumberOfDeinterlaceModes(
+ [in] VMRVideoDesc* lpVideoDescription,
+ [in] [out] LPDWORD lpdwNumDeinterlaceModes,
+ [out] LPGUID lpDeinterlaceModes
+ );
+
+ //
+ // For the given video description get the capabilities of the
+ // specified de-interlace mode.
+ //
+ HRESULT GetDeinterlaceModeCaps(
+ [in] LPGUID lpDeinterlaceMode,
+ [in] VMRVideoDesc* lpVideoDescription,
+ [in] [out] VMRDeinterlaceCaps* lpDeinterlaceCaps
+ );
+
+ //
+ // Get/Set the deinterlace mode that you would like the
+ // VMR to use when de-interlacing the specified stream.
+ // It should be noted that the VMR may not actually be able
+ // to use the requested deinterlace mode, in which case the
+ // the VMR will fall back to other de-interlace modes as specified
+ // by the de-interlace preferences (see SetDeinterlacePrefs below).
+ //
+ HRESULT GetDeinterlaceMode(
+ [in] DWORD dwStreamID,
+ [out] LPGUID lpDeinterlaceMode // returns GUID_NULL if SetDeinterlaceMode
+ ); // has not been called yet.
+
+ HRESULT SetDeinterlaceMode(
+ [in] DWORD dwStreamID, // use 0xFFFFFFFF to set mode for all streams
+ [in] LPGUID lpDeinterlaceMode // GUID_NULL == turn deinterlacing off
+ );
+
+
+ HRESULT GetDeinterlacePrefs(
+ [out] LPDWORD lpdwDeinterlacePrefs
+ );
+
+ HRESULT SetDeinterlacePrefs(
+ [in] DWORD dwDeinterlacePrefs
+ );
+
+ //
+ // Get the DeinterlaceMode currently in use for the specified
+ // video stream (ie. pin). The returned GUID will be NULL if
+ // the de-interlacing h/w has not been created by the VMR at the
+ // time the function is called, or if the VMR determines that
+ // this stream should not or can be de-interlaced.
+ //
+ HRESULT GetActualDeinterlaceMode(
+ [in] DWORD dwStreamID,
+ [out] LPGUID lpDeinterlaceMode
+ );
+}
+
+
+//=====================================================================
+//
+// IVMRMixerBitmap
+//
+//=====================================================================
+typedef struct _VMRALPHABITMAP
+{
+ DWORD dwFlags; // flags word
+ HDC hdc; // DC for the bitmap to copy
+ LPDIRECTDRAWSURFACE7 pDDS; // DirectDraw surface to copy
+ RECT rSrc; // rectangle to copy from the DC/DDS
+ NORMALIZEDRECT rDest; // output rectangle in composition space
+ FLOAT fAlpha; // opacity of the bitmap
+ COLORREF clrSrcKey; // src color key
+} VMRALPHABITMAP, *PVMRALPHABITMAP;
+
+// Disable the alpha bitmap for now
+cpp_quote("#define VMRBITMAP_DISABLE 0x00000001")
+
+// Take the bitmap from the HDC rather than the DirectDraw surface
+cpp_quote("#define VMRBITMAP_HDC 0x00000002")
+
+// Take the entire DDraw surface - rSrc is ignored
+cpp_quote("#define VMRBITMAP_ENTIREDDS 0x00000004")
+
+// Indicates that the clrTrans value is valid and should be
+// used when blending
+cpp_quote("#define VMRBITMAP_SRCCOLORKEY 0x00000008")
+
+// Indicates that the rSrc rectangle is valid and specifies a
+// sub-rectangle of the of original app image to be blended.
+// Use of this parameter enables "Image Strips"
+cpp_quote("#define VMRBITMAP_SRCRECT 0x00000010")
+
+[
+ object,
+ local,
+ uuid(1E673275-0257-40aa-AF20-7C608D4A0428),
+ helpstring("IVMRMixerBitmap Interface"),
+ pointer_default(unique)
+]
+interface IVMRMixerBitmap : IUnknown
+{
+ // Set bitmap, location to blend it, and blending value
+ HRESULT SetAlphaBitmap(
+ [in] const VMRALPHABITMAP *pBmpParms
+ );
+
+ // Change bitmap location, size and blending value,
+ // graph must be running for change to take effect.
+ HRESULT UpdateAlphaBitmapParameters(
+ [in] PVMRALPHABITMAP pBmpParms
+ );
+
+ // Get bitmap, location to blend it, and blending value
+ HRESULT GetAlphaBitmapParameters(
+ [out] PVMRALPHABITMAP pBmpParms
+ );
+};
+
+
+
+
+
+//=====================================================================
+//
+// IVMRImageCompositor
+//
+//=====================================================================
+
+typedef struct _VMRVIDEOSTREAMINFO {
+ LPDIRECTDRAWSURFACE7 pddsVideoSurface;
+ DWORD dwWidth, dwHeight;
+ DWORD dwStrmID;
+ FLOAT fAlpha;
+ DDCOLORKEY ddClrKey;
+ NORMALIZEDRECT rNormal;
+} VMRVIDEOSTREAMINFO;
+[
+ local,
+ object,
+ local,
+ uuid(7a4fb5af-479f-4074-bb40-ce6722e43c82),
+ helpstring("IVMRImageCompositor Interface"),
+ pointer_default(unique)
+]
+interface IVMRImageCompositor : IUnknown
+{
+ HRESULT InitCompositionTarget(
+ [in] IUnknown* pD3DDevice,
+ [in] LPDIRECTDRAWSURFACE7 pddsRenderTarget
+ );
+
+ HRESULT TermCompositionTarget(
+ [in] IUnknown* pD3DDevice,
+ [in] LPDIRECTDRAWSURFACE7 pddsRenderTarget
+ );
+
+ HRESULT SetStreamMediaType(
+ [in] DWORD dwStrmID,
+ [in] AM_MEDIA_TYPE* pmt,
+ [in] BOOL fTexture
+ );
+
+ HRESULT CompositeImage(
+ [in] IUnknown* pD3DDevice,
+ [in] LPDIRECTDRAWSURFACE7 pddsRenderTarget,
+ [in] AM_MEDIA_TYPE* pmtRenderTarget,
+ [in] REFERENCE_TIME rtStart,
+ [in] REFERENCE_TIME rtEnd,
+ [in] DWORD dwClrBkGnd,
+ [in] VMRVIDEOSTREAMINFO* pVideoStreamInfo,
+ [in] UINT cStreams
+ );
+};
+
+
+
+//=====================================================================
+//
+// IVMRVideoStreamControl
+//
+//=====================================================================
+[
+ object,
+ local,
+ uuid(058d1f11-2a54-4bef-bd54-df706626b727),
+ helpstring("IVMRMixerStreamConfig Interface"),
+ pointer_default(unique)
+]
+interface IVMRVideoStreamControl: IUnknown
+{
+ HRESULT SetColorKey(
+ [in] LPDDCOLORKEY lpClrKey // Source color key, set to 0xFFFFFFFF to disable
+ );
+
+ HRESULT GetColorKey(
+ [out] LPDDCOLORKEY lpClrKey
+ );
+
+
+ HRESULT SetStreamActiveState(
+ [in] BOOL fActive
+ );
+
+ HRESULT GetStreamActiveState(
+ [out] BOOL* lpfActive
+ );
+};
+
+
+
+//=====================================================================
+//
+// IVMRSurface
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(a9849bbe-9ec8-4263-b764-62730f0d15d0),
+ helpstring("IVMRSurface Interface"),
+ pointer_default(unique)
+]
+interface IVMRSurface : IUnknown
+{
+ HRESULT IsSurfaceLocked();
+
+ HRESULT LockSurface(
+ [out] BYTE** lpSurface
+ );
+
+ HRESULT UnlockSurface();
+
+ HRESULT GetSurface(
+ [out] LPDIRECTDRAWSURFACE7 *lplpSurface
+ );
+};
+
+
+
+//=====================================================================
+//
+// IID_IVMRImagePresenterConfig - this interface allows applications
+// to configure the default Microsoft provided allocator-presenter
+// inorder to simplify the implementation of their own
+// allocator-presenter plug-in.
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(9f3a1c85-8555-49ba-935f-be5b5b29d178),
+ helpstring("IVMRImagePresenterConfig Interface"),
+ pointer_default(unique)
+]
+
+interface IVMRImagePresenterConfig : IUnknown
+{
+
+ HRESULT SetRenderingPrefs(
+ [in] DWORD dwRenderFlags // see VMRRenderPrefs for valid flags
+ );
+
+ HRESULT GetRenderingPrefs(
+ [out] DWORD* dwRenderFlags // see VMRRenderPrefs for valid flags
+ );
+
+}
+
+//=====================================================================
+//
+// IID_IVMRImagePresenterExclModeConfig - this interface allows applications
+// to configure the DDraw exclusive mode allocator-presenter. This
+// interface extends the IVMRImagePresenterConfig interface defined
+// above and is only implemented by the CLSID_AllocPresenterDDXclMode
+// allocator-presenter object.
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(e6f7ce40-4673-44f1-8f77-5499d68cb4ea),
+ helpstring("IVMRImagePresenterExclModeConfig Interface"),
+ pointer_default(unique)
+]
+
+interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig
+{
+ HRESULT SetXlcModeDDObjAndPrimarySurface(
+ [in] LPDIRECTDRAW7 lpDDObj,
+ [in] LPDIRECTDRAWSURFACE7 lpPrimarySurf
+ );
+
+ HRESULT GetXlcModeDDObjAndPrimarySurface(
+ [out] LPDIRECTDRAW7* lpDDObj,
+ [out] LPDIRECTDRAWSURFACE7* lpPrimarySurf
+ );
+}
+
+
+//=====================================================================
+//
+// IVPManager
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(aac18c18-e186-46d2-825d-a1f8dc8e395a),
+ helpstring("IVPManager Interface"),
+ pointer_default(unique)
+]
+interface IVPManager : IUnknown
+{
+ // Use this method on a Multi-Monitor system to specify to the
+ // video port manager filter which videoport index is used
+ // to an upstream decoder filter.
+ //
+ HRESULT SetVideoPortIndex(
+ [in] DWORD dwVideoPortIndex // the video port number that this is connected to
+ );
+
+ // This method returns the current video port index being used by the VPM.
+ //
+ HRESULT GetVideoPortIndex(
+ [out] DWORD* pdwVideoPortIndex // the video port number that this is connected to
+ );
+};
+
diff --git a/dxsdk/Include/DShowIDL/amstream.idl b/dxsdk/Include/DShowIDL/amstream.idl
new file mode 100644
index 00000000..f52db99e
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/amstream.idl
@@ -0,0 +1,334 @@
+//------------------------------------------------------------------------------
+// File: AMStream.idl
+//
+// Desc:
+//
+// Copyright (c) 1998 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+import "mmstream.idl";
+import "strmif.idl";
+
+cpp_quote("#include <ddraw.h>")
+cpp_quote("#include <mmsystem.h>")
+cpp_quote("#include <mmstream.h>")
+cpp_quote("#include <ddstream.h>")
+cpp_quote("#include <austream.h>")
+
+
+
+interface IAMMultiMediaStream;
+interface IAMMediaStream;
+interface IMediaStreamFilter;
+interface IDirectDraw;
+interface IDirectDrawSurface;
+interface IAMMediaTypeStream;
+interface IAMMediaTypeSample;
+
+// Flags definitions for IAMMultiMediaStream::Initialize
+enum {
+ AMMSF_NOGRAPHTHREAD = 0x00000001
+};
+
+// Flags definitions for AddMediaStream and IAMMediaStream::Initialize
+enum {
+ // Don't add a stream - create a default renderer instead
+ // for the supplied purpose id
+ AMMSF_ADDDEFAULTRENDERER = 0x00000001,
+ AMMSF_CREATEPEER = 0x00000002,
+
+ // If no samples are created when we run or the last sample
+ // is deleted then terminate this stream
+ AMMSF_STOPIFNOSAMPLES = 0x00000004,
+
+ // If Update is not called keep going
+ AMMSF_NOSTALL = 0x00000008
+};
+
+
+// Flag definitions for OpenFile and OpenMoniker
+enum {
+ AMMSF_RENDERTYPEMASK = 0x00000003,
+ AMMSF_RENDERTOEXISTING = 0x00000000,
+ AMMSF_RENDERALLSTREAMS = 0x00000001,
+ AMMSF_NORENDER = 0x00000002,
+
+ AMMSF_NOCLOCK = 0x00000004,
+ AMMSF_RUN = 0x00000008
+};
+
+
+typedef [v1_enum] enum {
+ Disabled = 0,
+ ReadData = 1,
+ RenderData = 2
+} OUTPUT_STATE;
+
+
+[
+object,
+uuid(7DB01C96-C0C3-11d0-8FF1-00C04FD9189D),
+dual,
+helpstring("IDirectShowStream Interface"),
+pointer_default(unique)
+]
+interface IDirectShowStream : IDispatch
+{
+ [propget, id(1), helpstring("property FileName")] HRESULT FileName([out, retval] BSTR *pVal);
+ [propput, id(1), helpstring("property FileName")] HRESULT FileName([in] BSTR newVal);
+ [propget, id(2), helpstring("property Video")] HRESULT Video([out, retval] OUTPUT_STATE *pVal);
+ [propput, id(2), helpstring("propetry Video")] HRESULT Video([in] OUTPUT_STATE newVal);
+ [propget, id(3), helpstring("property Audio")] HRESULT Audio([out, retval] OUTPUT_STATE *pVal);
+ [propput, id(3), helpstring("propetry Audio")] HRESULT Audio([in] OUTPUT_STATE newVal);
+};
+
+
+// IAMMultiMediaStream interface
+[
+object,
+uuid(BEBE595C-9A6F-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IAMMultiMediaStream : IMultiMediaStream
+{
+ HRESULT Initialize(
+ [in] STREAM_TYPE StreamType,
+ [in] DWORD dwFlags,
+ [in] IGraphBuilder *pFilterGraph);
+
+ HRESULT GetFilterGraph(
+ [out] IGraphBuilder **ppGraphBuilder);
+
+ HRESULT GetFilter(
+ [out] IMediaStreamFilter **ppFilter);
+
+ HRESULT AddMediaStream(
+ [in] IUnknown *pStreamObject,
+ [in] const MSPID *PurposeId,
+ [in] DWORD dwFlags,
+ [out] IMediaStream **ppNewStream);
+
+ HRESULT OpenFile(
+ [in] LPCWSTR pszFileName,
+ [in] DWORD dwFlags);
+
+ HRESULT OpenMoniker(
+ [in] IBindCtx *pCtx,
+ [in] IMoniker *pMoniker,
+ [in] DWORD dwFlags);
+
+ HRESULT Render(
+ [in] DWORD dwFlags);
+}
+
+
+// IAMMediaStream interface
+[
+object,
+uuid(BEBE595D-9A6F-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IAMMediaStream : IMediaStream
+{
+ HRESULT Initialize(
+ [in] IUnknown *pSourceObject,
+ [in] DWORD dwFlags,
+ [in] REFMSPID PurposeId,
+ [in] const STREAM_TYPE StreamType);
+
+ HRESULT SetState(
+ [in] FILTER_STATE State);
+
+ HRESULT JoinAMMultiMediaStream(
+ [in] IAMMultiMediaStream *pAMMultiMediaStream);
+
+ HRESULT JoinFilter(
+ [in] IMediaStreamFilter *pMediaStreamFilter);
+
+ HRESULT JoinFilterGraph(
+ [in] IFilterGraph *pFilterGraph);
+};
+
+
+
+
+// IMediaStreamFilter interface
+[
+object,
+local,
+uuid(BEBE595E-9A6F-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IMediaStreamFilter : IBaseFilter
+{
+ HRESULT AddMediaStream(
+ [in] IAMMediaStream *pAMMediaStream);
+
+ HRESULT GetMediaStream(
+ [in] REFMSPID idPurpose,
+ [out] IMediaStream **ppMediaStream);
+
+ HRESULT EnumMediaStreams(
+ [in] long Index,
+ [out] IMediaStream **ppMediaStream);
+
+ HRESULT SupportSeeking(
+ [in] BOOL bRenderer);
+
+ HRESULT ReferenceTimeToStreamTime(
+ [in] [out] REFERENCE_TIME *pTime);
+
+ HRESULT GetCurrentStreamTime(
+ [out] REFERENCE_TIME *pCurrentStreamTime);
+
+ HRESULT WaitUntil(
+ [in] REFERENCE_TIME WaitStreamTime);
+
+ HRESULT Flush(
+ [in] BOOL bCancelEOS);
+
+ HRESULT EndOfStream();
+};
+
+
+
+[
+object,
+local,
+uuid(AB6B4AFC-F6E4-11d0-900D-00C04FD9189D),
+pointer_default(unique)
+]
+interface IDirectDrawMediaSampleAllocator : IUnknown
+{
+ HRESULT GetDirectDraw(IDirectDraw **ppDirectDraw);
+};
+
+
+[
+object,
+local,
+uuid(AB6B4AFE-F6E4-11d0-900D-00C04FD9189D),
+pointer_default(unique)
+]
+interface IDirectDrawMediaSample : IUnknown
+{
+ HRESULT GetSurfaceAndReleaseLock(
+ [out] IDirectDrawSurface **ppDirectDrawSurface,
+ [out] RECT * pRect);
+ HRESULT LockMediaSamplePointer(void);
+};
+
+
+
+
+
+[
+object,
+local,
+uuid(AB6B4AFA-F6E4-11d0-900D-00C04FD9189D),
+pointer_default(unique)
+]
+
+interface IAMMediaTypeStream : IMediaStream
+{
+ HRESULT GetFormat(
+ [out] AM_MEDIA_TYPE * pMediaType,
+ [in] DWORD dwFlags);
+
+ HRESULT SetFormat(
+ [in] AM_MEDIA_TYPE * pMediaType,
+ [in] DWORD dwFlags);
+
+ HRESULT CreateSample(
+ [in] long lSampleSize,
+ [in] BYTE * pbBuffer,
+ [in] DWORD dwFlags,
+ [in] IUnknown *pUnkOuter,
+ [out] IAMMediaTypeSample ** ppAMMediaTypeSample);
+
+ HRESULT GetStreamAllocatorRequirements(
+ [out] ALLOCATOR_PROPERTIES *pProps);
+
+ HRESULT SetStreamAllocatorRequirements(
+ [in] ALLOCATOR_PROPERTIES *pProps);
+};
+
+
+[
+object,
+local,
+uuid(AB6B4AFB-F6E4-11d0-900D-00C04FD9189D),
+pointer_default(unique)
+]
+interface IAMMediaTypeSample : IStreamSample
+{
+ //
+ // Unique methods for IAMMediaTypeSample
+ //
+ HRESULT SetPointer([in] BYTE *pBuffer, [in] long lSize);
+
+ //
+ // Mirror of IMediaSample
+ //
+ HRESULT GetPointer([out] BYTE ** ppBuffer);
+ long GetSize(void);
+ HRESULT GetTime([out] REFERENCE_TIME * pTimeStart, [out] REFERENCE_TIME * pTimeEnd);
+ HRESULT SetTime([in] REFERENCE_TIME * pTimeStart, [in] REFERENCE_TIME * pTimeEnd);
+ HRESULT IsSyncPoint(void);
+ HRESULT SetSyncPoint(BOOL bIsSyncPoint);
+ HRESULT IsPreroll(void);
+ HRESULT SetPreroll(BOOL bIsPreroll);
+ long GetActualDataLength(void);
+ HRESULT SetActualDataLength(long);
+ HRESULT GetMediaType(AM_MEDIA_TYPE **ppMediaType);
+ HRESULT SetMediaType(AM_MEDIA_TYPE *pMediaType);
+ HRESULT IsDiscontinuity(void);
+ HRESULT SetDiscontinuity(BOOL bDiscontinuity);
+ HRESULT GetMediaTime([out] LONGLONG * pTimeStart, [out] LONGLONG * pTimeEnd);
+ HRESULT SetMediaTime([in] LONGLONG * pTimeStart, [in] LONGLONG * pTimeEnd);
+};
+
+
+[
+ uuid(4E6CDE29-C0C4-11d0-8FF1-00C04FD9189D),
+ version(1.0),
+ helpstring("DirectShowStream 1.0 Type Library")
+]
+
+library DirectShowStreamLib
+{
+ importlib("stdole2.tlb");
+ [
+ uuid(49c47ce5-9ba4-11d0-8212-00c04fc32c45),
+ helpstring("DirectShow Multi Media Stream")
+ ]
+ coclass AMMultiMediaStream
+ {
+ [default] dispinterface IDirectShowStream;
+ };
+};
+
+
+
+//
+// The MIDL compiler wants to produce a CLSID for everything defined in
+// our type library, but it also wants to generate huge proxy code,
+// so we use DEFINE_GUID for all other classes. It has another interesting
+// bug in that it defines CLSID_AMMultiMediaStream within a #ifdef __cplusplus
+// block, so we need to define it outside of that scope.
+//
+
+cpp_quote("#ifndef __cplusplus")
+cpp_quote("EXTERN_C const CLSID CLSID_AMMultiMediaStream;")
+cpp_quote("#endif")
+
+cpp_quote("DEFINE_GUID(CLSID_AMDirectDrawStream, /* 49c47ce4-9ba4-11d0-8212-00c04fc32c45 */")
+cpp_quote("0x49c47ce4, 0x9ba4, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);")
+cpp_quote("DEFINE_GUID(CLSID_AMAudioStream, /* 8496e040-af4c-11d0-8212-00c04fc32c45 */")
+cpp_quote("0x8496e040, 0xaf4c, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);")
+cpp_quote("DEFINE_GUID(CLSID_AMAudioData, /* f2468580-af8a-11d0-8212-00c04fc32c45 */")
+cpp_quote("0xf2468580, 0xaf8a, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);")
+cpp_quote("DEFINE_GUID(CLSID_AMMediaTypeStream, /* CF0F2F7C-F7BF-11d0-900D-00C04FD9189D */")
+cpp_quote("0xcf0f2f7c, 0xf7bf, 0x11d0, 0x90, 0xd, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);")
diff --git a/dxsdk/Include/DShowIDL/austream.idl b/dxsdk/Include/DShowIDL/austream.idl
new file mode 100644
index 00000000..4987aa08
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/austream.idl
@@ -0,0 +1,106 @@
+//------------------------------------------------------------------------------
+// File: AuStream.idl
+//
+// Desc: Used by MIDL tool to generate austream.h
+//
+// Copyright (c) 1998-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+import "mmstream.idl";
+
+cpp_quote("//")
+cpp_quote("// The following declarations within the 'if 0' block are dummy typedefs used to make")
+cpp_quote("// the ddstream.idl file build. The actual definitions are contained in DDRAW.H")
+cpp_quote("//")
+cpp_quote("#if 0")
+typedef struct tWAVEFORMATEX WAVEFORMATEX;
+cpp_quote ("#endif")
+
+interface IAudioMediaStream;
+interface IAudioStreamSample;
+interface IMemoryData;
+interface IAudioData;
+
+// IAudioMediaStream
+
+
+[
+object,
+local,
+uuid(f7537560-a3be-11d0-8212-00c04fc32c45),
+pointer_default(unique)
+]
+interface IAudioMediaStream : IMediaStream
+{
+
+ HRESULT GetFormat(
+ [out] WAVEFORMATEX *pWaveFormatCurrent
+ );
+
+ HRESULT SetFormat(
+ [in] const WAVEFORMATEX *lpWaveFormat);
+
+ HRESULT CreateSample(
+ [in] IAudioData *pAudioData,
+ [in] DWORD dwFlags,
+ [out] IAudioStreamSample **ppSample
+ );
+}
+
+[
+object,
+local,
+uuid(345fee00-aba5-11d0-8212-00c04fc32c45),
+pointer_default(unique)
+]
+interface IAudioStreamSample : IStreamSample
+{
+ HRESULT GetAudioData(
+ [out] IAudioData **ppAudio
+ );
+}
+
+
+[
+object,
+local,
+uuid(327fc560-af60-11d0-8212-00c04fc32c45),
+pointer_default(unique)
+]
+interface IMemoryData : IUnknown
+{
+ HRESULT SetBuffer(
+ [in] DWORD cbSize,
+ [in] BYTE *pbData,
+ [in] DWORD dwFlags
+ );
+
+ HRESULT GetInfo(
+ [out] DWORD *pdwLength,
+ [out] BYTE **ppbData,
+ [out] DWORD *pcbActualData
+ );
+ HRESULT SetActual(
+ [in] DWORD cbDataValid
+ );
+}
+
+[
+object,
+local,
+uuid(54c719c0-af60-11d0-8212-00c04fc32c45),
+pointer_default(unique)
+]
+interface IAudioData : IMemoryData
+{
+ HRESULT GetFormat(
+ [out] WAVEFORMATEX *pWaveFormatCurrent
+ );
+
+ HRESULT SetFormat(
+ [in] const WAVEFORMATEX *lpWaveFormat
+ );
+}
+
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("};")
diff --git a/dxsdk/Include/DShowIDL/axextend.idl b/dxsdk/Include/DShowIDL/axextend.idl
new file mode 100644
index 00000000..257fb19a
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/axextend.idl
@@ -0,0 +1,5169 @@
+//------------------------------------------------------------------------------
+// File: AXExtend.idl
+//
+// Desc: Extended streaming interface definitions for the ActiveMovie
+// streaming and synchronization architecture. Core streaming
+// interfaces are in AXCore.idl, and control interfaces for the
+// type library are in Control.odl.
+//
+// Copyright (c) 1992 - 2000, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+// include after unknwn.idl, objidl.idl and axcore.idl
+
+
+// forward declarations - these are the interfaces declared in this file
+
+interface IEnumRegFilters;
+interface IFileSourceFilter;
+interface IFileSinkFilter;
+interface IFileSinkFilter2;
+interface IGraphBuilder;
+interface ICaptureGraphBuilder;
+interface ICaptureGraphBuilder2;
+interface IAMCopyCaptureFileProgress;
+interface IFilterMapper;
+interface IFilterMapper2;
+interface IMediaEventSink;
+interface IOverlay;
+interface IOverlayNotify;
+interface IOverlayNotify2;
+interface IQualityControl;
+interface ISeekingPassThru;
+interface IAMStreamConfig;
+interface IAMDevMemoryAllocator;
+interface IAMDevMemoryControl;
+interface IConfigInterleaving;
+interface IConfigAviMux;
+interface IAMVideoCompression;
+interface IAMVfwCaptureDialogs;
+interface IAMVfwCompressDialogs;
+interface IAMDroppedFrames;
+interface IAMAudioInputMixer;
+interface IAMBufferNegotiation;
+interface IAMAnalogVideoDecoder;
+interface IAMVideoProcAmp;
+interface IAMAnalogVideoEncoder;
+interface IAMCameraControl;
+interface IAMCrossbar;
+interface IAMTVTuner;
+interface IKsPropertySet;
+interface IAMPhysicalPinInfo;
+interface IAMExtDevice;
+interface IAMExtTransport;
+interface IAMTimecodeReader;
+interface IAMTimecodeGenerator;
+interface IAMTimecodeDisplay;
+interface IDrawVideoImage;
+interface IDecimateVideoImage;
+interface IAMVideoDecimationProperties;
+interface IAMPushSource;
+interface IAMAudioRendererStats;
+interface IAMLatency;
+interface IAMGraphStreams;
+interface IAMOverlayFX;
+interface IAMOpenProgress;
+interface IMpeg2Demultiplexer ;
+interface IMPEG2StreamIdMap ;
+interface IEnumStreamIdMap ;
+interface IAMClockSlave ;
+interface IEncoderAPI;
+interface IVideoEncoder;
+interface IAMGraphBuilderCallback;
+interface IAMCertifiedOutputProtection;
+
+//==========================================================================
+//==========================================================================
+// IEnumRegFilters interface -- enumerates registered filters.
+// enumerator interface returned from IFilterMapper::EnumMatchingFilters().
+// based on IEnum pseudo-template
+//==========================================================================
+//==========================================================================
+
+typedef struct {
+ CLSID Clsid; // class id of the filter
+ LPWSTR Name; // name of filter
+} REGFILTER;
+
+[
+object,
+uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+
+// The point of the mapper is to avoid loading filters. By looking in the
+// registry we can reduce the number of filters which must be loaded and tried.
+// This enumerator returns descriptors of filters (including the GUIDs that
+// CoCreateInstance can instantiate). The filters themselves are not loaded.
+
+interface IEnumRegFilters : IUnknown {
+ import "unknwn.idl";
+
+ // The caller must use CoTaskMemFree to free each REGFILTER* returned
+ // in the array.
+ HRESULT Next
+ ( [in] ULONG cFilters, // place this many filters...
+ [out] REGFILTER ** apRegFilter, // ...in this array of REGFILTER*
+ [out] ULONG * pcFetched // actual count passed returned here
+ );
+
+ // I can't think why anyone would want to skip, so it's not implemented.
+ // (anyone who thinks they know what they would be skipping over is probably
+ // missing some piece of the jigsaw). This ALWAYS returns E_NOTIMPL.
+
+ HRESULT Skip(
+ [in] ULONG cFilters
+ );
+
+ HRESULT Reset(void);
+
+ // No cloning either - also ALWAYS returns E_NOTIMPL.
+
+ HRESULT Clone(
+ [out] IEnumRegFilters **ppEnum
+ );
+}
+
+
+typedef IEnumRegFilters *PENUMREGFILTERS;
+
+//========================================================================
+//========================================================================
+// abstraction representing the registered information about filters.
+// This allows properties of filters to be looked up without loading them.
+//========================================================================
+//========================================================================
+
+[
+object,
+uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IFilterMapper : IUnknown {
+ import "unknwn.idl";
+
+ //==========================================================================
+ // Registration functions.
+ // A filter should be registered before any other use.
+ // The registration can be NON_VOLATILE (i.e. permanent, do once ever)
+ // or VOLATILE (once per boot of the system).
+ // UnregisterFilter (obviously) removes the registration.
+ // The action of any of the other calls on unregistered filters is undefined.
+ // it will either work or you'll get an error, but I'm not saying which.
+ //==========================================================================
+
+ // Four predefined values controling the order in which filters are tried
+ // for intelligent graph building. Intermediate values are legal.
+ // Any value <=MERIT_DO_NOT_USE will mean that the filter will never
+ // be tried by the filtergrah to automatically complete a connection.
+
+ enum { MERIT_PREFERRED = 0x800000,
+ MERIT_NORMAL = 0x600000,
+ MERIT_UNLIKELY = 0x400000,
+ MERIT_DO_NOT_USE = 0x200000,
+ MERIT_SW_COMPRESSOR = 0x100000,
+ MERIT_HW_COMPRESSOR = 0x100050
+ };
+
+ // Register a filter
+
+ HRESULT RegisterFilter
+ ( [in] CLSID clsid, // GUID of the filter
+ [in] LPCWSTR Name, // Descriptive name for the filter
+ [in] DWORD dwMerit // DO_NOT_USE, UNLIKELY, NORMAL or PREFERRED.
+ );
+
+
+ // Register an identifiable instance of a filter. This deals with cases
+ // such as two similar sound cards which are driven by the same driver,
+ // but we want to choose which oif these cards the sound will come out of.
+ // This is not needed if there is only one instance of the filter
+ // (e.g. there is only one sound card in the machine) or if all instances
+ // of the filter are equivalent.
+
+ // The filter itself must have already been registered // ??? Is that true?
+ HRESULT RegisterFilterInstance
+ ( [in] CLSID clsid, // GUID of the filter
+ [in] LPCWSTR Name, // Descriptive name of instance.
+ [out] CLSID *MRId // Returned Media Resource Id. A
+ // locally unique id for this instance
+ // of this filter
+ );
+
+
+ HRESULT RegisterPin
+ ( [in] CLSID Filter, // GUID of filter
+ [in] LPCWSTR Name, // Name of the pin
+ [in] BOOL bRendered, // The filter renders this input
+ [in] BOOL bOutput, // TRUE if this is an Output pin
+ [in] BOOL bZero, // TRUE if OK for zero instances of pin
+ // In this case you will have to Create
+ // a pin to have even one instance
+ [in] BOOL bMany, // TRUE if OK for many instances of pin
+ [in] CLSID ConnectsToFilter, // Filter it connects to if it has
+ // subterranean connection, else NULL
+ [in] LPCWSTR ConnectsToPin // Name of pin it connects to
+ // NULL for output pins
+ );
+
+ HRESULT RegisterPinType
+ ( [in] CLSID clsFilter, // GUID of filter
+ [in] LPCWSTR strName, // Descriptive name of the pin
+ [in] CLSID clsMajorType, // Major type of the data stream
+ [in] CLSID clsSubType // Sub type of the data stream
+ );
+
+
+ HRESULT UnregisterFilter
+ ( [in] CLSID Filter // GUID of filter
+ );
+
+
+ HRESULT UnregisterFilterInstance
+ ( [in] CLSID MRId // Media Resource Id of this instance
+ );
+
+
+ HRESULT UnregisterPin
+ ( [in] CLSID Filter, // GUID of filter
+ [in] LPCWSTR Name // Name of the pin
+ );
+
+
+ // Set *ppEnum to be an enumerator for filters matching the requirements.
+
+ HRESULT EnumMatchingFilters
+ ( [out] IEnumRegFilters **ppEnum // enumerator returned
+ , [in] DWORD dwMerit // at least this merit needed
+ , [in] BOOL bInputNeeded // need at least one input pin
+ , [in] CLSID clsInMaj // input major type
+ , [in] CLSID clsInSub // input sub type
+ , [in] BOOL bRender // must the input be rendered?
+ , [in] BOOL bOututNeeded // need at least one output pin
+ , [in] CLSID clsOutMaj // output major type
+ , [in] CLSID clsOutSub // output sub type
+ );
+
+}
+
+// structure used to identify media types a pin handles. Used for
+// registration through IFilterMapper and IFilterMapper2
+//
+typedef struct
+{
+ const CLSID * clsMajorType;
+ const CLSID * clsMinorType;
+} REGPINTYPES;
+
+// describes pin for filter registration. Used for registration
+// through IFilterMapper and IFilterMapper2
+//
+typedef struct
+{
+ LPWSTR strName;
+
+ // The filter renders this input
+ BOOL bRendered;
+
+ // This is an Output pin
+ BOOL bOutput;
+
+ // OK to have zero instances of pin In this case you will have to
+ // Create a pin to have even one instance
+ BOOL bZero;
+
+ // OK to create many instance of pin
+ BOOL bMany;
+
+ const CLSID * clsConnectsToFilter;
+ const WCHAR * strConnectsToPin;
+
+ UINT nMediaTypes;
+ const REGPINTYPES * lpMediaType;
+} REGFILTERPINS;
+
+// mediums (as defined in the Windows NT DDK) for registration with
+// IFilterMapper2
+//
+typedef struct
+{
+ CLSID clsMedium;
+ DWORD dw1;
+ DWORD dw2;
+} REGPINMEDIUM;
+
+// flags for dwFlags in REFILTERPINS2
+enum
+{
+ // OK to have zero instances of pin In this case you will have to
+ // Create a pin to have even one instance
+ REG_PINFLAG_B_ZERO = 0x1,
+
+ // The filter renders this input
+ REG_PINFLAG_B_RENDERER = 0x2,
+
+ // OK to create many instance of pin
+ REG_PINFLAG_B_MANY = 0x4,
+
+ // This is an Output pin
+ REG_PINFLAG_B_OUTPUT = 0x8
+};
+
+
+// describes pin for filter registration through IFilterMapper2
+typedef struct
+{
+ // combination of REG_PINFLAG flags
+ DWORD dwFlags;
+
+ // number of instances of the pin if known
+ UINT cInstances;
+
+ UINT nMediaTypes;
+ [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType;
+
+ UINT nMediums;
+ [size_is(nMediums)] const REGPINMEDIUM *lpMedium;
+
+ // pin category (for Kernel Streaming pins) as defined in the
+ // Windows NT DDK
+ const CLSID *clsPinCategory;
+
+} REGFILTERPINS2;
+
+// describes filter for registration through IFilterMapper2
+typedef struct
+{
+ DWORD dwVersion; // 1 or 2
+ DWORD dwMerit;
+
+ /* unnamed union */
+ [switch_is(dwVersion)] [switch_type(DWORD)] union
+ {
+ [case(1)]
+
+ struct
+ {
+ ULONG cPins;
+ [size_is(cPins)] const REGFILTERPINS *rgPins;
+ };
+
+ [case(2)]
+
+ struct
+ {
+ ULONG cPins2;
+ [size_is(cPins2)] const REGFILTERPINS2 *rgPins2;
+ };
+
+ [default]
+ ;
+ } ;
+
+} REGFILTER2;
+
+
+
+[
+object,
+uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375),
+pointer_default(unique)
+]
+interface IFilterMapper2 : IUnknown {
+ import "unknwn.idl";
+
+ // create or rename ActiveMovie category
+ HRESULT CreateCategory
+ ( [in] REFCLSID clsidCategory,
+ [in] DWORD dwCategoryMerit,
+ [in] LPCWSTR Description
+ );
+
+ HRESULT UnregisterFilter
+ ( [in] const CLSID *pclsidCategory,
+ [in] const OLECHAR *szInstance,
+ [in] REFCLSID Filter // GUID of filter
+ );
+
+ // Register a filter, pins, and media types under a category.
+ HRESULT RegisterFilter
+ ( [in] REFCLSID clsidFilter, // GUID of the filter
+ [in] LPCWSTR Name, // Descriptive name for the filter
+
+ // ppMoniker can be null. or *ppMoniker can contain the
+ // moniker where this filter data will be written;
+ // *ppMoniker will be set to null on return. or *ppMoniker
+ // can be null in which case the moniker will be returned
+ // with refcount.
+ [in, out] IMoniker **ppMoniker,
+
+ // can be null
+ [in] const CLSID *pclsidCategory,
+
+ // cannot be null
+ [in] const OLECHAR *szInstance,
+
+ // rest of filter and pin registration
+ [in] const REGFILTER2 *prf2
+ );
+
+ // Set *ppEnum to be an enumerator for filters matching the
+ // requirements.
+ HRESULT EnumMatchingFilters
+ ( [out] IEnumMoniker **ppEnum // enumerator returned
+ , [in] DWORD dwFlags // 0
+ , [in] BOOL bExactMatch // don't match wildcards
+ , [in] DWORD dwMerit // at least this merit needed
+ , [in] BOOL bInputNeeded // need at least one input pin
+ , [in] DWORD cInputTypes // Number of input types to match
+ // Any match is OK
+ , [size_is(cInputTypes*2)] const GUID *pInputTypes // input major+subtype pair array
+ , [in] const REGPINMEDIUM *pMedIn // input medium
+ , [in] const CLSID *pPinCategoryIn // input pin category
+ , [in] BOOL bRender // must the input be rendered?
+ , [in] BOOL bOutputNeeded // need at least one output pin
+ , [in] DWORD cOutputTypes // Number of output types to match
+ // Any match is OK
+ , [size_is(cOutputTypes*2)] const GUID *pOutputTypes // output major+subtype pair array
+ , [in] const REGPINMEDIUM *pMedOut // output medium
+ , [in] const CLSID *pPinCategoryOut // output pin category
+ );
+}
+
+[
+object,
+uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375),
+pointer_default(unique)
+]
+interface IFilterMapper3 : IFilterMapper2 {
+ // new interface to allow creating filters using the mapper's devenum instance
+ // primarily needed for out-of-proc access to a graph
+ HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum );
+}
+
+//========================================================================
+//========================================================================
+// Defines IQualityControl interface
+//
+// Defines quality messages and allows a quality manager to install itself
+// as the sink for quality messages.
+//========================================================================
+//========================================================================
+
+typedef enum tagQualityMessageType {
+ Famine,
+ Flood
+} QualityMessageType;
+
+typedef struct tagQuality {
+ QualityMessageType Type;
+ long Proportion; // milli-units. 1000 = no change
+ // for Flood:
+ // What proportion of the media samples currently
+ // coming through are required in the future.
+ // 800 means please drop another 20%
+ // For Famine:
+ // How much to "keep in" e.g. 800 means send me
+ // 20% less e.g. by dropping 20% of the samples.
+ // 1100 would mean "I'm coping, send me more".
+ REFERENCE_TIME Late;
+ // How much you need to catch up by
+ REFERENCE_TIME TimeStamp;
+ // The stream time when this was generated (probably
+ // corresponds to the start time on some sample).
+} Quality;
+
+typedef IQualityControl *PQUALITYCONTROL;
+
+
+[
+object,
+uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IQualityControl : IUnknown {
+
+ // Notify the recipient that a quality change is requested.
+ // pSelf is the IBaseFilter* of the sender.
+ // this is sent from a filter
+ // to (the quality manager or) an upstream peer.
+ HRESULT Notify
+ ( [in] IBaseFilter * pSelf,
+ [in] Quality q
+ );
+
+ // Notify the recipient that future quality messages are to be sent
+ // to iqc. If piqc is NULL then quality messages are to default back to
+ // the upstream peer.
+ // This is sent from the quality manager to a filter.
+ // The recipient should hold piqc as a WEAK reference,
+ // i.e. do not AddRef it, do not Release it.
+ HRESULT SetSink
+ ( [in] IQualityControl * piqc
+ );
+}
+
+//=====================================================================
+//=====================================================================
+// Definitions required for overlay transport
+//=====================================================================
+//=====================================================================
+
+
+// Used to communicate the colour that the IOverlay client wants the window
+// painted in so that it can draw directly to the correct clipping region
+// A colour key can be described in two alternate ways, the first is by a
+// range of one or more (system) palette indices. The second is by defining
+// a colour cube with two RGB values, any of which would be acceptable.
+//
+// The CK values are consistent with GDI PALETTEINDEX and PALETTERGB macros
+
+
+enum { CK_NOCOLORKEY = 0x0, // No color key is required
+ CK_INDEX = 0x1, // Index into the current system palette
+ CK_RGB = 0x2 }; // Color key is an RGB value (or range)
+
+typedef struct tagCOLORKEY {
+
+ DWORD KeyType; // Explains meaning of the structure
+ DWORD PaletteIndex; // Palette index if available
+ COLORREF LowColorValue; // Low colour space RGB value
+ COLORREF HighColorValue; // Defines the high RGB value
+
+} COLORKEY;
+
+// When a filter sets up an advise link it can ask that only certain types
+// of notifications be sent, for example just palette changes. While this
+// doesn't mean that the other notification call backs won't ever be called
+// the IOverlay implementation may use this as an efficiency optimisation
+
+enum { ADVISE_NONE = 0x0, // No notifications required
+ ADVISE_CLIPPING = 0x1, // Synchronous clip information
+ ADVISE_PALETTE = 0x2, // Palette change notifications
+ ADVISE_COLORKEY = 0x4, // Called when colour key changes
+ ADVISE_POSITION = 0x8, // Likewise when window moves etc
+ ADVISE_DISPLAY_CHANGE = 0x10 // Called on WM_DISPLAYCHANGE
+ };
+
+const DWORD ADVISE_ALL = ADVISE_CLIPPING |
+ ADVISE_PALETTE |
+ ADVISE_COLORKEY |
+ ADVISE_POSITION;
+
+const DWORD ADVISE_ALL2 = ADVISE_ALL |
+ ADVISE_DISPLAY_CHANGE;
+
+// This isn't defined when you run IDL
+
+cpp_quote("#ifndef _WINGDI_")
+
+typedef struct _RGNDATAHEADER {
+ DWORD dwSize;
+ DWORD iType;
+ DWORD nCount;
+ DWORD nRgnSize;
+ RECT rcBound;
+} RGNDATAHEADER;
+
+typedef struct _RGNDATA {
+ RGNDATAHEADER rdh;
+ char Buffer[1];
+} RGNDATA;
+
+cpp_quote("#endif")
+
+
+//=====================================================================
+//=====================================================================
+// Defines IOverlayNotify interface
+//
+// This interface gives asynchronous notifications of changes to the
+// rendering window - such as changes to the exposed window area
+//=====================================================================
+//=====================================================================
+
+[
+object,
+local,
+uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IOverlayNotify : IUnknown {
+
+ // IOverlayNotify methods
+
+ // This notifies the filter of palette changes, the filter should copy
+ // the array of RGBQUADs if it needs to use them after returning. This
+ // is not called when the palette is actually changed in the display
+ // but at a short time after (in sync with WM_PALETTECHANGED messages)
+
+ HRESULT OnPaletteChange(
+ [in] DWORD dwColors, // Number of colours present
+ [in] const PALETTEENTRY *pPalette); // Array of palette colours
+
+ // This provides synchronous clip changes so that the client is called
+ // before the window is moved to freeze the video, and then when the
+ // window has stabilised it is called again to start playback again.
+ // If the window rect is all zero then the window is invisible, the
+ // filter must take a copy of the information if it wants to keep it
+
+ HRESULT OnClipChange(
+ [in] const RECT *pSourceRect, // Region of video to use
+ [in] const RECT *pDestinationRect, // Where video goes
+ [in] const RGNDATA *pRgnData); // Defines clipping information
+
+ HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey);
+
+ // The calls to OnClipChange happen in sync with the window. So it is
+ // called with an empty clip list before the window moves to freeze
+ // the video, and then when the window has stabilised it is called
+ // again with the new clip list. The OnPositionChange callback is for
+ // overlay cards that don't want the expense of synchronous clipping
+ // updates and just want to know when the source or destination video
+ // positions change. They will NOT be called in sync with the window
+ // but at some point after the window has changed (basicly in time
+ // with WM_SIZE etc messages received). This is therefore suitable
+ // for overlay cards that don't inlay their data to the frame buffer
+ // NOTE the destination is NOT clipped to the visible display area
+
+ HRESULT OnPositionChange([in] const RECT *pSourceRect,
+ [in] const RECT *pDestinationRect);
+}
+
+typedef IOverlayNotify *POVERLAYNOTIFY;
+
+
+//=====================================================================
+//=====================================================================
+// Defines IOverlayNotify2 interface
+//
+// This interface gives asynchronous notifications of changes to the
+// rendering window - such as changes to the exposed window area
+// This is optionally supported by the advise sink for the purposes
+// of accepting OnDisplayChange notification.
+//=====================================================================
+//=====================================================================
+
+cpp_quote("#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500)")
+cpp_quote("#define HMONITOR_DECLARED")
+cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
+cpp_quote("#endif")
+cpp_quote("DECLARE_HANDLE(HMONITOR);")
+cpp_quote("#endif")
+
+[
+object,
+local,
+uuid(680EFA10-D535-11D1-87C8-00A0C9223196),
+pointer_default(unique)
+]
+interface IOverlayNotify2 : IOverlayNotify {
+
+ // IOverlayNotify2 methods
+
+ HRESULT OnDisplayChange( // ADVISE_DISPLAY_CHANGE
+ HMONITOR hMonitor);
+}
+
+typedef IOverlayNotify2 *POVERLAYNOTIFY2;
+
+
+//=====================================================================
+//=====================================================================
+// Defines IOverlay interface
+//
+// This interface provides information so that a filter can write direct to
+// the frame buffer while placing the video in the correct window position
+//=====================================================================
+//=====================================================================
+
+[
+object,
+local,
+uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IOverlay : IUnknown {
+
+ // IOverlay methods
+
+ HRESULT GetPalette(
+ [out] DWORD *pdwColors, // Number of colours present
+ [out] PALETTEENTRY **ppPalette); // Where to put palette data
+
+ HRESULT SetPalette(
+ [in] DWORD dwColors, // Number of colours present
+ [in] PALETTEENTRY *pPalette); // Colours to use for palette
+
+ // If you change the colour key through SetColorKey then all the advise
+ // links will receive an OnColorKeyChange callback with the new colour
+
+ HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey);
+ HRESULT GetColorKey([out] COLORKEY *pColorKey);
+ HRESULT SetColorKey([in,out] COLORKEY *pColorKey);
+ HRESULT GetWindowHandle([out] HWND *pHwnd);
+
+ // The IOverlay implementation allocates the memory for the clipping
+ // rectangles as it can be variable in length. The filter calling
+ // this method should free the memory when it is finished with it
+
+ HRESULT GetClipList([out] RECT *pSourceRect,
+ [out] RECT *pDestinationRect,
+ [out] RGNDATA **ppRgnData);
+
+ // Returns the current video source and destination
+
+ HRESULT GetVideoPosition([out] RECT *pSourceRect,
+ [out] RECT *pDestinationRect);
+
+ HRESULT Advise(
+ [in] IOverlayNotify *pOverlayNotify, // Notification interface
+ [in] DWORD dwInterests); // Callbacks interested in
+
+ HRESULT Unadvise(); // Stop the callbacks now
+}
+
+typedef IOverlay *POVERLAY;
+
+
+//=====================================================================
+//=====================================================================
+// control related interfaces (others are defined in control.odl)
+//=====================================================================
+//=====================================================================
+
+
+//=====================================================================
+//=====================================================================
+// Defines IMediaEventSink interface
+//
+// Exposed by filtergraph. Called by filters to notify events. Will be
+// passed on to application by the IMediaControl event methods.
+//=====================================================================
+//=====================================================================
+
+[
+ object,
+ uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IMediaEventSink : IUnknown {
+
+ // notify an event. will be queued, but not delivered to
+ // the application on this thread.
+ HRESULT Notify(
+ [in] long EventCode,
+ [in] LONG_PTR EventParam1,
+ [in] LONG_PTR EventParam2
+ );
+}
+
+typedef IMediaEventSink *PMEDIAEVENTSINK;
+
+//=====================================================================
+//=====================================================================
+// Defines IFileSourceFilter interface
+//
+// Exposed by source filters to set the file name and media type.
+//=====================================================================
+//=====================================================================
+
+[
+ object,
+ uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IFileSourceFilter : IUnknown {
+
+ // Load a file and assign it the given media type
+ HRESULT Load(
+ [in] LPCOLESTR pszFileName, // Pointer to absolute path of file to open
+ [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL
+ );
+ // Get the currently loaded file name
+ HRESULT GetCurFile(
+ [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file
+ [out] AM_MEDIA_TYPE *pmt // Pointer to the media type
+ );
+}
+
+typedef IFileSourceFilter *PFILTERFILESOURCE;
+
+//=====================================================================
+//=====================================================================
+// Defines IFileSinkFilter interface
+//
+// Exposed by renderers to set the output file name.
+//=====================================================================
+//=====================================================================
+
+[
+ object,
+ uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6),
+ pointer_default(unique)
+]
+interface IFileSinkFilter : IUnknown {
+
+ // Output to this file. default is to open the existing file
+ HRESULT SetFileName(
+ [in] LPCOLESTR pszFileName, // Pointer to absolute path of output file
+ [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL
+ );
+ // Get the current file name
+ HRESULT GetCurFile(
+ [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file
+ [out] AM_MEDIA_TYPE *pmt // Pointer to the media type
+ );
+}
+
+typedef IFileSinkFilter *PFILTERFILESINK;
+
+[
+ object,
+ uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86),
+ pointer_default(unique)
+]
+interface IFileSinkFilter2 : IFileSinkFilter {
+
+ HRESULT SetMode(
+ [in] DWORD dwFlags // AM_FILESINK_FLAGS
+ );
+
+ HRESULT GetMode(
+ [out] DWORD *pdwFlags // AM_FILESINK_FLAGS
+ );
+}
+
+typedef IFileSinkFilter2 *PFILESINKFILTER2;
+
+typedef enum {
+
+ // create a new file
+ AM_FILE_OVERWRITE = 0x00000001,
+
+} AM_FILESINK_FLAGS;
+
+
+//
+// Intelligent connectivity for filters - an interface supported by
+// filter graphs (since it is an extension to IFilterGraph) that supports
+// building of graphs by automatic selection and connection of appropriate
+// filters
+
+[
+ object,
+ uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IGraphBuilder : IFilterGraph {
+ // Connect these two pins directly or indirectly, using transform filters
+ // if necessary.
+
+ HRESULT Connect
+ ( [in] IPin * ppinOut, // the output pin
+ [in] IPin * ppinIn // the input pin
+ );
+
+
+ // Connect this output pin directly or indirectly, using transform filters
+ // if necessary to something that will render it.
+
+ HRESULT Render
+ ( [in] IPin * ppinOut // the output pin
+ );
+
+
+ // Build a filter graph that will render this file using this play list.
+ // If lpwstrPlayList is NULL then it will use the default play list
+ // which will typically render the whole file.
+
+ HRESULT RenderFile
+ ( [in] LPCWSTR lpcwstrFile,
+ [in, unique] LPCWSTR lpcwstrPlayList
+ );
+
+
+ // Add to the filter graph a source filter for this file. This would
+ // be the same source filter that would be added by calling Render.
+ // This call gives you more control over building
+ // the rest of the graph, e.g. AddFilter(<a renderer of your choice>)
+ // and then Connect the two.
+ // The IBaseFilter* interface exposed by the source filter is returned
+ // in ppFilter, addrefed already for you
+ // The filter will be known by the name lpcwstrFIlterName
+ // nn this filter graph,
+ HRESULT AddSourceFilter
+ ( [in] LPCWSTR lpcwstrFileName,
+ [in, unique] LPCWSTR lpcwstrFilterName,
+ [out] IBaseFilter* *ppFilter
+ );
+
+
+ // If this call is made then trace information will be written to the
+ // file showing the actions taken in attempting to perform an operation.
+ HRESULT SetLogFile
+ ( [in] DWORD_PTR hFile // open file handle e.g. from CreateFile
+ );
+
+
+ // Request that the graph builder should return as soon as possible from
+ // its current task.
+ // Note that it is possible fot the following to occur in the following
+ // sequence:
+ // Operation begins; Abort is requested; Operation completes normally.
+ // This would be normal whenever the quickest way to finish an operation
+ // was to simply continue to the end.
+ HRESULT Abort();
+
+ // Return S_OK if the curent operation is to continue,
+ // return S_FALSE if the current operation is to be aborted.
+ // This method can be called as a callback from a filter which is doing
+ // some operation at the request of the graph.
+ HRESULT ShouldOperationContinue();
+
+}
+
+
+//
+// New capture graph builder
+
+[
+ object,
+ uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5),
+ pointer_default(unique)
+]
+interface ICaptureGraphBuilder : IUnknown {
+
+ // Use this filtergraph
+ HRESULT SetFiltergraph(
+ [in] IGraphBuilder *pfg);
+
+ // what filtergraph are you using?
+ // *ppfg->Release() when you're done with it
+ HRESULT GetFiltergraph(
+ [out] IGraphBuilder **ppfg);
+
+ // creates a rendering section in the filtergraph consisting of a MUX
+ // of some filetype, and a file writer (and connects them together)
+ // *ppf->Release() when you're done with it
+ // *ppSink->Release() when you're done with it
+ HRESULT SetOutputFileName(
+ [in] const GUID *pType, // type of file to write, eg. MEDIASUBTYPE_Avi
+ [in] LPCOLESTR lpstrFile, // filename given to file writer
+ [out] IBaseFilter **ppf, // returns pointer to the MUX
+ [out] IFileSinkFilter **ppSink);// queried from file writer
+
+ // Looks for an interface on the filter and on the output pin of the given
+ // category. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or
+ // NULL for "don't care".
+ // It will also look upstream and downstream of
+ // the pin for the interface, to find interfaces on renderers, MUXES, TV
+ // Tuners, etc.
+ // Call *ppint->Release() when you're done with it
+ [local] HRESULT FindInterface(
+ [in, unique] const GUID *pCategory, // can be NULL for all pins
+ [in] IBaseFilter *pf,
+ [in] REFIID riid,
+ [out] void **ppint);
+ [call_as(FindInterface)] HRESULT RemoteFindInterface(
+ [in, unique] const GUID *pCategory, // can be NULL for all pins
+ [in] IBaseFilter *pf,
+ [in] REFIID riid,
+ [out] IUnknown **ppint);
+
+ // Connects the pin of the given category of the source filter to the
+ // rendering filter, optionally through another filter (compressor?)
+ // For a non-NULL category, it will instantiate and connect additional
+ // required filters upstream too, like TV Tuners and Crossbars.
+ // If there is only one output pin on the source, use a NULL
+ // category. You can also have pSource be a pin
+ HRESULT RenderStream(
+ [in] const GUID *pCategory, // can be NULL if only one output pin
+ [in] IUnknown *pSource, // filter or pin
+ [in] IBaseFilter *pfCompressor,
+ [in] IBaseFilter *pfRenderer); // can be NULL
+
+ // Sends IAMStreamControl messages to the pin of the desired category, eg.
+ // "capture" or "preview"
+ // REFERENCE_TIME=NULL means NOW
+ // REFERENCE_TIME=MAX_TIME means never, or cancel previous request
+ // NULL controls all capture filters in the graph - you will get one
+ // notification for each filter with a pin of that category found
+ // returns S_FALSE if stop will be signalled before last sample is
+ // rendered.
+ // return a FAILURE code if the filter does not support IAMStreamControl
+ HRESULT ControlStream(
+ [in] const GUID *pCategory,
+ [in] IBaseFilter *pFilter,
+ [in] REFERENCE_TIME *pstart,
+ [in] REFERENCE_TIME *pstop,
+ [in] WORD wStartCookie, // high word reserved
+ [in] WORD wStopCookie); // high word reserved
+
+ // creates a pre-allocated file of a given size in bytes
+ HRESULT AllocCapFile(
+ [in] LPCOLESTR lpstr,
+ [in] DWORDLONG dwlSize);
+
+ // Copies the valid file data out of the old, possibly huge old capture
+ // file into a shorter new file.
+ // Return S_FALSE from your progress function to abort capture, S_OK to
+ // continue
+ HRESULT CopyCaptureFile(
+ [in] LPOLESTR lpwstrOld,
+ [in] LPOLESTR lpwstrNew,
+ [in] int fAllowEscAbort, // pressing ESC will abort?
+ [in] IAMCopyCaptureFileProgress *pCallback); // implement this to
+ // get progress
+}
+
+
+//
+// Capture graph builder "CopyCapturedFile" progress callback
+
+[
+ object,
+ uuid(670d1d20-a068-11d0-b3f0-00aa003761c5),
+ pointer_default(unique)
+]
+interface IAMCopyCaptureFileProgress : IUnknown {
+
+ // If you support this interface somewhere, this function will be called
+ // periodically while ICaptureGraphBuilder::CopyCaptureFile is executing
+ // to let you know the progress
+ //
+ // Return S_OK from this function to continue. Return S_FALSE to abort the
+ // copy
+ HRESULT Progress(
+ [in] int iProgress); // a number between 0 and 100 (%)
+}
+
+
+//
+// Capture graph builder that can deal with a single filter having more than
+// one pin of each category... some new devices can capture both audio and
+// video, for example
+//
+
+[
+ object,
+ uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D),
+ pointer_default(unique)
+]
+interface ICaptureGraphBuilder2 : IUnknown {
+
+ // Use this filtergraph
+ HRESULT SetFiltergraph(
+ [in] IGraphBuilder *pfg);
+
+ // what filtergraph are you using?
+ // *ppfg->Release() when you're done with it
+ HRESULT GetFiltergraph(
+ [out] IGraphBuilder **ppfg);
+
+ // creates a rendering section in the filtergraph consisting of a MUX
+ // of some filetype, and a file writer (and connects them together)
+ // *ppf->Release() when you're done with it
+ // *ppSink->Release() when you're done with it
+ HRESULT SetOutputFileName(
+ [in] const GUID *pType, // GUID of MUX filter to use
+ [in] LPCOLESTR lpstrFile, // filename given to file writer
+ [out] IBaseFilter **ppf, // returns pointer to the MUX
+ [out] IFileSinkFilter **ppSink);// queried from file writer
+
+ // Looks for an interface on the filter and on the output pin of the given
+ // category and type. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or
+ // NULL for "don't care". Type: MAJORTYPE_Video/Audio etc or NULL)
+ // !!! Will some filters have >1 capture pin? ie RGB and MPEG?
+ // It will also look upstream and downstream of
+ // the pin for the interface, to find interfaces on renderers, MUXES, TV
+ // Tuners, etc.
+ // Call *ppint->Release() when you're done with it
+ [local] HRESULT FindInterface(
+ [in] const GUID *pCategory, // can be NULL for all pins
+ [in] const GUID *pType, // Audio/Video/??? or NULL (don't care)
+ [in] IBaseFilter *pf,
+ [in] REFIID riid,
+ [out] void **ppint);
+ [call_as(FindInterface)] HRESULT RemoteFindInterface(
+ [in] const GUID *pCategory, // can be NULL for all pins
+ [in] const GUID *pType, // Audio/Video/??? or NULL (don't care)
+ [in] IBaseFilter *pf,
+ [in] REFIID riid,
+ [out] IUnknown **ppint);
+
+ // Connects the pin of the given category and type of the source filter to
+ // the rendering filter, optionally through another filter (compressor?)
+ // (Type is a Majortype, like Video or Audio)
+ // For a non-NULL category, it will instantiate and connect additional
+ // required filters upstream too, like TV Tuners and Crossbars.
+ // If there is only one output pin on the source, use a NULL category
+ // and type. You can also have pSource be a pin
+ HRESULT RenderStream(
+ [in] const GUID *pCategory, // can be NULL if only one output pin
+ [in] const GUID *pType, // Major type (Video/Audio/etc)
+ [in] IUnknown *pSource, // filter or pin
+ [in] IBaseFilter *pfCompressor,
+ [in] IBaseFilter *pfRenderer); // can be NULL
+
+ // Sends IAMStreamControl messages to the pin of the desired category,
+ // (eg. "capture" or "preview") and of the desired type (eg. VIDEO or AUDIO)
+ // A category MUST be given. If a filter is given, a type must be too.
+ // REFERENCE_TIME=NULL means NOW
+ // REFERENCE_TIME=MAX_TIME means never, or cancel previous request
+ // NULL controls all capture filters in the graph - you will get one
+ // notification for each filter with a pin of that category found
+ // returns S_FALSE if stop will be signalled before last sample is
+ // rendered.
+ // return a FAILURE code if the filter does not support IAMStreamControl
+ HRESULT ControlStream(
+ [in] const GUID *pCategory,
+ [in] const GUID *pType, // Major type (Video/Audio/etc)
+ [in] IBaseFilter *pFilter,
+ [in] REFERENCE_TIME *pstart,
+ [in] REFERENCE_TIME *pstop,
+ [in] WORD wStartCookie, // high word reserved
+ [in] WORD wStopCookie); // high word reserved
+
+ // creates a pre-allocated file of a given size in bytes
+ HRESULT AllocCapFile(
+ [in] LPCOLESTR lpstr,
+ [in] DWORDLONG dwlSize);
+
+ // Copies the valid file data out of the old, possibly huge old capture
+ // file into a shorter new file.
+ // Return S_FALSE from your progress function to abort capture, S_OK to
+ // continue
+ HRESULT CopyCaptureFile(
+ [in] LPOLESTR lpwstrOld,
+ [in] LPOLESTR lpwstrNew,
+ [in] int fAllowEscAbort, // pressing ESC will abort?
+ [in] IAMCopyCaptureFileProgress *pCallback); // implement this to
+ // get progress
+ // Helper fn to find a certain pin on a filter.
+ HRESULT FindPin(
+ [in] IUnknown *pSource,
+ [in] PIN_DIRECTION pindir, // input or output?
+ [in] const GUID *pCategory, // what category? (or NULL)
+ [in] const GUID *pType, // what Major type (or NULL)
+ [in] BOOL fUnconnected, // must it be unconnected?
+ [in] int num, // which pin matching this? (0 based)
+ [out] IPin **ppPin);
+}
+
+enum _AM_RENSDEREXFLAGS {
+ AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01 // Dont add any renderers
+};
+
+//
+// IFilterGraph2
+//
+// New methods on for IFilterGraph and IGraphBuilder will have to go here.
+//
+
+[
+ object,
+ uuid(36b73882-c2c8-11cf-8b46-00805f6cef60),
+ pointer_default(unique)
+]
+interface IFilterGraph2: IGraphBuilder {
+
+ // Add a Moniker source moniker
+ HRESULT AddSourceFilterForMoniker(
+ [in] IMoniker *pMoniker,
+ [in] IBindCtx *pCtx,
+ [in, unique] LPCWSTR lpcwstrFilterName,
+ [out] IBaseFilter **ppFilter
+ );
+
+ // Specify the type for a reconnect
+ // This is better than Reconnect as sometime the parties to a
+ // reconnection can't remember what type they'd agreed (!)
+ HRESULT ReconnectEx
+ ( [in] IPin * ppin, // the pin to disconnect and reconnect
+ [in, unique] const AM_MEDIA_TYPE *pmt // the type to reconnect with - can be NULL
+ );
+
+ // Render a pin without adding any new renderers
+ HRESULT RenderEx( [in] IPin *pPinOut, // Pin to render
+ [in] DWORD dwFlags, // flags
+ [in, out] DWORD *pvContext // Unused - set to NULL
+ );
+
+#if 0
+ // Method looks for a filter which supports the specified interface. If such
+ // a filter exists, an AddRef()'ed pointer to the requested interface is placed
+ // in *ppInterface.
+ //
+ // *ppInterface will be NULL on return if such a filter could not be found, and
+ // the method will return E_NOINTERFACE.
+ //
+ // pdwIndex is an internal index that is used for obtaining subsequent interfaces.
+ // *pdwIndex should be initialized to zero. It is set on return to a value that
+ // allows the implementation of FindFilterInterface to search for further interfaces
+ // if called again. If no more such interfaces exist, the method will return E_NOINTERFACE.
+ //
+ // If pdwIndex is NULL, FindFilterInterface returns an interface only if there is just
+ // a single filter in the graph that supports the interface. Otherwise it returns
+ // E_NOINTERFACE.
+ //
+ HRESULT FindFilterInterface( [in] REFIID iid, [out] void ** ppInterface, [in,out] LPDWORD pdwIndex );
+
+ // Tries to obtain the interface from the filter graph itself. If this fails,
+ // it attempts to find the unique filter that supports the interface.
+ // On failure the method will return E_NOINTERFACE. On success, it returns
+ // S_OK and an AddRef()'ed pointer to the requested interface in *ppInterface.
+ //
+ HRESULT FindInterface( [in] REFIID iid, [out] void ** ppInterface );
+
+#endif
+}
+
+//
+// StreamBuilder
+// aka Graph building with constraints
+// aka convergent graphs
+// aka Closed captioning
+
+[
+ object,
+ local,
+ uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IStreamBuilder : IUnknown {
+
+ // Connect this output pin directly or indirectly, using transform filters
+ // if necessary to thing(s) that will render it, within this graph
+ // Move from Initial state to Rendered state.
+
+ HRESULT Render
+ ( [in] IPin * ppinOut, // the output pin
+ [in] IGraphBuilder * pGraph // the graph
+ );
+
+ // Undo what you did in Render. Return to Initial state.
+ HRESULT Backout
+ ( [in] IPin * ppinOut, // the output pin
+ [in] IGraphBuilder * pGraph // the graph
+ );
+}
+
+
+// async reader interface - supported by file source filters. Allows
+// multiple overlapped reads from different positions
+
+
+[
+ object,
+ uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IAsyncReader : IUnknown
+{
+ // pass in your preferred allocator and your preferred properties.
+ // method returns the actual allocator to be used. Call GetProperties
+ // on returned allocator to learn alignment and prefix etc chosen.
+ // this allocator will be not be committed and decommitted by
+ // the async reader, only by the consumer.
+ // Must call this before calling Request.
+ HRESULT RequestAllocator(
+ [in] IMemAllocator* pPreferred,
+ [in] ALLOCATOR_PROPERTIES* pProps,
+ [out] IMemAllocator ** ppActual);
+
+ // queue a request for data.
+ // media sample start and stop times contain the requested absolute
+ // byte position (start inclusive, stop exclusive).
+ // may fail if sample not obtained from agreed allocator.
+ // may fail if start/stop position does not match agreed alignment.
+ // samples allocated from source pin's allocator may fail
+ // GetPointer until after returning from WaitForNext.
+ // Stop position must be aligned - this means it may exceed duration.
+ // on completion, stop position will be corrected to unaligned
+ // actual data.
+ HRESULT Request(
+ [in] IMediaSample* pSample,
+ [in] DWORD_PTR dwUser); // user context
+
+ // block until the next sample is completed or the timeout occurs.
+ // timeout (millisecs) may be 0 or INFINITE. Samples may not
+ // be delivered in order. If there is a read error of any sort, a
+ // notification will already have been sent by the source filter,
+ // and HRESULT will be an error.
+ // If ppSample is not null, then a Request completed with the result
+ // code returned.
+ HRESULT WaitForNext(
+ [in] DWORD dwTimeout,
+ [out] IMediaSample** ppSample, // completed sample
+ [out] DWORD_PTR * pdwUser); // user context
+
+ // sync read of data. Sample passed in must have been acquired from
+ // the agreed allocator. Start and stop position must be aligned.
+ // equivalent to a Request/WaitForNext pair, but may avoid the
+ // need for a thread on the source filter.
+ HRESULT SyncReadAligned(
+ [in] IMediaSample* pSample);
+
+
+ // sync read. works in stopped state as well as run state.
+ // need not be aligned. Will fail if read is beyond actual total
+ // length.
+ HRESULT SyncRead(
+ [in] LONGLONG llPosition, // absolute file position
+ [in] LONG lLength, // nr bytes required
+ [out, size_is(lLength)]
+ BYTE* pBuffer); // write data here
+
+ // return total length of stream, and currently available length.
+ // reads for beyond the available length but within the total length will
+ // normally succeed but may block for a long period.
+ HRESULT Length(
+ [out] LONGLONG* pTotal,
+ [out] LONGLONG* pAvailable);
+
+ // cause all outstanding reads to return, possibly with a failure code
+ //(VFW_E_TIMEOUT) indicating they were cancelled.
+ // Between BeginFlush and EndFlush calls, Request calls will fail and
+ // WaitForNext calls will always complete immediately.
+ HRESULT BeginFlush(void);
+ HRESULT EndFlush(void);
+}
+
+
+// interface provided by the filtergraph itself to let other objects
+// (especially plug-in distributors, but also apps like graphedt) know
+// when the graph has changed.
+[
+ object,
+ uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IGraphVersion : IUnknown
+{
+ // returns the current graph version number
+ // this is incremented every time there is a change in the
+ // set of filters in the graph or in their connections
+ //
+ // if this is changed since your last enumeration, then re-enumerate
+ // the graph
+ HRESULT QueryVersion(LONG* pVersion);
+}
+
+
+
+
+//
+// interface describing an object that uses resources.
+//
+// implement if: you request resources using IResourceManager. You will
+// need to pass your implementation of this pointer as an in param.
+//
+// use if: you are a resource manager who implements IResourceManager
+[
+ object,
+ uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IResourceConsumer : IUnknown
+{
+ // you may acquire the resource specified.
+ // return values:
+ // S_OK -- I have successfully acquired it
+ // S_FALSE -- I will acquire it and call NotifyAcquire afterwards
+ // VFW_S_NOT_NEEDED: I no longer need the resource
+ // FAILED(hr)-I tried to acquire it and failed.
+
+ HRESULT
+ AcquireResource(
+ [in] LONG idResource);
+
+
+
+ // Please release the resource.
+ // return values:
+ // S_OK -- I have released it (and want it again when available)
+ // S_FALSE -- I will call NotifyRelease when I have released it
+ // other something went wrong.
+ HRESULT
+ ReleaseResource(
+ [in] LONG idResource);
+}
+
+
+
+// interface describing a resource manager that will resolve contention for
+// named resources.
+//
+// implement if: you are a resource manager. The filtergraph will be a resource
+// manager, internally delegating to the system wide resource manager
+// (when there is one)
+//
+// use if: you need resources that are limited. Use the resource manager to
+// resolve contention by registering the resource with this interface,
+// and requesting it from this interface whenever needed.
+//
+// or use if: you detect focus changes which should affect resource usage.
+// Notifying change of focus to the resource manager will cause the resource
+// manager to switch contended resources to the objects that have the user's
+// focus
+[
+ object,
+ uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IResourceManager : IUnknown
+{
+ // tell the manager how many there are of a resource.
+ // ok if already registered. will take new count. if new count
+ // is lower, will de-allocate resources to new count.
+ //
+ // You get back a token that will be used in further calls.
+ //
+ // Passing a count of 0 will eliminate this resource. There is currently
+ // no defined way to find the id without knowing the count.
+ //
+ HRESULT
+ Register(
+ [in] LPCWSTR pName, // this named resource
+ [in] LONG cResource, // has this many instances
+ [out] LONG* plToken // token placed here on return
+ );
+
+ HRESULT
+ RegisterGroup(
+ [in] LPCWSTR pName, // this named resource group
+ [in] LONG cResource, // has this many resources
+ [in, size_is(cResource)]
+ LONG* palTokens, // these are the contained resources
+ [out] LONG* plToken // group resource id put here on return
+ );
+
+ // request the use of a given, registered resource.
+ // possible return values:
+ // S_OK == yes you can use it now
+ // S_FALSE == you will be called back when the resource is available
+ // other - there is an error.
+ //
+ // The priority of this request should be affected by the associated
+ // focus object -- that is, when SetFocus is called for that focus
+ // object (or a 'related' object) then my request should be put through.
+ //
+ // A filter should pass the filter's IUnknown here. The filtergraph
+ // will match filters to the filtergraph, and will attempt to trace
+ // filters to common source filters when checking focus objects.
+ // The Focus object must be valid for the entire lifetime of the request
+ // -- until you call CancelRequest or NotifyRelease(id, p, FALSE)
+ HRESULT
+ RequestResource(
+ [in] LONG idResource,
+ [in] IUnknown* pFocusObject,
+ [in] IResourceConsumer* pConsumer
+ );
+
+
+ // notify the resource manager that an acquisition attempt completed.
+ // Call this method after an AcquireResource method returned
+ // S_FALSE to indicate asynchronous acquisition.
+ // HR should be S_OK if the resource was successfully acquired, or a
+ // failure code if the resource could not be acquired.
+ HRESULT
+ NotifyAcquire(
+ [in] LONG idResource,
+ [in] IResourceConsumer* pConsumer,
+ [in] HRESULT hr);
+
+ // Notify the resource manager that you have released a resource. Call
+ // this in response to a ReleaseResource method, or when you have finished
+ // with the resource. bStillWant should be TRUE if you still want the
+ // resource when it is next available, or FALSE if you no longer want
+ // the resource.
+ HRESULT
+ NotifyRelease(
+ [in] LONG idResource,
+ [in] IResourceConsumer* pConsumer,
+ [in] BOOL bStillWant);
+
+ // I don't currently have the resource, and I no longer need it.
+ HRESULT
+ CancelRequest(
+ [in] LONG idResource,
+ [in] IResourceConsumer* pConsumer);
+
+ // Notify the resource manager that a given object has been given the
+ // user's focus. In ActiveMovie, this will normally be a video renderer
+ // whose window has received the focus. The filter graph will switch
+ // contended resources to (in order):
+ // requests made with this same focus object
+ // requests whose focus object shares a common source with this
+ // requests whose focus object shares a common filter graph
+ // After calling this, you *must* call ReleaseFocus before the IUnknown
+ // becomes invalid, unless you can guarantee that another SetFocus
+ // of a different object is done in the meantime. No addref is held.
+ //
+ // The resource manager will hold this pointer until replaced or cancelled,
+ // and will use it to resolve resource contention. It will call
+ // QueryInterface for IBaseFilter at least and if found will call methods on
+ // that interface.
+ HRESULT
+ SetFocus(
+ [in] IUnknown* pFocusObject);
+
+ // Sets the focus to NULL if the current focus object is still
+ // pFocusObject. Call this when
+ // the focus object is about to be destroyed to ensure that no-one is
+ // still referencing the object.
+ HRESULT
+ ReleaseFocus(
+ [in] IUnknown* pFocusObject);
+
+
+
+// !!! still need
+// -- app override (some form of SetPriority)
+// -- enumeration and description of resources
+
+}
+
+
+//
+// Interface representing an object that can be notified about state
+// and other changes within a filter graph. The filtergraph will call plug-in
+// distributors that expose this optional interface so that they can
+// respond to appropriate changes.
+//
+// Implement if: you are a plug-in distributor (your class id is found
+// under HKCR\Interface\<IID>\Distributor= for some interface).
+//
+// Use if: you are the filtergraph.
+[
+ object,
+ uuid(56a868af-0ad4-11ce-b03a-0020af0ba770),
+ pointer_default(unique)
+]
+interface IDistributorNotify : IUnknown
+{
+ // called when graph is entering stop state. Called before
+ // filters are stopped.
+ HRESULT Stop(void);
+
+ // called when graph is entering paused state, before filters are
+ // notified
+ HRESULT Pause(void);
+
+ // called when graph is entering running state, before filters are
+ // notified. tStart is the stream-time offset parameter that will be
+ // given to each filter's IBaseFilter::Run method.
+ HRESULT Run(REFERENCE_TIME tStart);
+
+ // called when the graph's clock is changing, with the new clock. Addref
+ // the clock if you hold it beyond this method. Called before
+ // the filters are notified.
+ HRESULT SetSyncSource(
+ [in] IReferenceClock * pClock);
+
+ // called when the set of filters or their connections has changed.
+ // Called on every AddFilter, RemoveFilter or ConnectDirect (or anything
+ // that will lead to one of these).
+ // You don't need to rebuild your list of interesting filters at this point
+ // but you should release any refcounts you hold on any filters that
+ // have been removed.
+ HRESULT NotifyGraphChange(void);
+}
+
+typedef enum {
+ AM_STREAM_INFO_START_DEFINED = 0x00000001,
+ AM_STREAM_INFO_STOP_DEFINED = 0x00000002,
+ AM_STREAM_INFO_DISCARDING = 0x00000004,
+ AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010
+} AM_STREAM_INFO_FLAGS;
+
+// Stream information
+typedef struct {
+ REFERENCE_TIME tStart;
+ REFERENCE_TIME tStop;
+ DWORD dwStartCookie;
+ DWORD dwStopCookie;
+ DWORD dwFlags;
+} AM_STREAM_INFO;
+
+//
+// IAMStreamControl
+//
+
+[
+ object,
+ uuid(36b73881-c2c8-11cf-8b46-00805f6cef60),
+ pointer_default(unique)
+]
+interface IAMStreamControl : IUnknown
+{
+ // The REFERENCE_TIME pointers may be null, which
+ // indicates immediately. If the pointer is non-NULL
+ // and dwCookie is non-zero, then pins should send
+ // EC_STREAM_CONTROL_STOPPED / EC_STREAM_CONTROL_STARTED
+ // with an IPin pointer and the cookie, thus allowing
+ // apps to tie the events back to their requests.
+ // If either dwCookies is zero, or the pointer is null,
+ // then no event is sent.
+
+ // If you have a capture pin hooked up to a MUX input pin and they
+ // both support IAMStreamControl, you'll want the MUX to signal the
+ // stop so you know the last frame was written out. In order for the
+ // MUX to know it's finished, the capture pin will have to send one
+ // extra sample after it was supposed to stop, so the MUX can trigger
+ // off that. So you would set bSendExtra to TRUE for the capture pin
+ // Leave it FALSE in all other cases.
+
+ HRESULT StartAt( [in] const REFERENCE_TIME * ptStart,
+ [in] DWORD dwCookie );
+ HRESULT StopAt( [in] const REFERENCE_TIME * ptStop,
+ [in] BOOL bSendExtra,
+ [in] DWORD dwCookie );
+ HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo);
+}
+
+
+
+//
+// ISeekingPassThru
+//
+
+[
+ object,
+ uuid(36b73883-c2c8-11cf-8b46-00805f6cef60),
+ pointer_default(unique)
+]
+interface ISeekingPassThru : IUnknown
+{
+ HRESULT Init( [in] BOOL bSupportRendering,
+ [in] IPin *pPin);
+}
+
+
+
+//
+// IAMStreamConfig - pin interface
+//
+
+// A capture filter or compression filter's output pin
+// supports this interface - no matter what data type you produce.
+
+// This interface can be used to set the output format of a pin (as an
+// alternative to connecting the pin using a specific media type).
+// After setting an output format, the pin will use that format
+// the next time it connects to somebody, so you can just Render that
+// pin and get a desired format without using Connect(CMediaType)
+// Your pin should do that by ONLY OFFERING the media type set in SetFormat
+// in its enumeration of media types, and no others. This will ensure that
+// that format is indeed used for connection (or at least offer it first).
+// An application interested in enumerating accepted mediatypes may have to
+// do so BEFORE calling SetFormat.
+
+// But this interface's GetStreamCaps function can get more information
+// about accepted media types than the traditional way of enumerating a pin's
+// media types, so it should typically be used instead.
+// GetStreamCaps gets information about the kinds of formats allowed... how
+// it can stretch and crop, and the frame rate and data rates allowed (for
+// video)
+
+// VIDEO EXAMPLE
+//
+// GetStreamCaps returns a whole array of {MediaType, Capabilities}.
+// Let's say your capture card supports JPEG anywhere between 160x120 and
+// 320x240, and also the size 640x480. Also, say it supports RGB24 at
+// resolutions between 160x120 and 320x240 but only multiples of 8. You would
+// expose these properties by offering a media type of 320 x 240 JPEG
+// (if that is your default or preferred size) coupled with
+// capabilities saying minimum 160x120 and maximum 320x240 with granularity of
+// 1. The next pair you expose is a media type of 640x480 JPEG coupled with
+// capabilities of min 640x480 max 640x480. The third pair is media type
+// 320x240 RGB24 with capabilities min 160x120 max 320x240 granularity 8.
+// In this way you can expose almost every quirk your card might have.
+// An application interested in knowing what compression formats you provide
+// can get all the pairs and make a list of all the unique sub types of the
+// media types.
+//
+// If a filter's output pin is connected with a media type that has rcSource
+// and rcTarget not empty, it means the filter is being asked to stretch the
+// rcSource sub-rectangle of its InputSize (the format of the input pin for
+// a compressor, and the largest bitmap a capture filter can generate with
+// every pixel unique) into the rcTarget sub-rectangle of its output format.
+// For instance, if a video compressor has as input 160x120 RGB, and as output
+// 320x240 MPEG with an rcSource of (10,10,20,20) and rcTarget of (0,0,100,100)
+// this means the compressor is being asked to take a 10x10 piece of the 160x120
+// RGB bitmap, and make it fill the top 100x100 area of a 320x240 bitmap,
+// leaving the rest of the 320x240 bitmap untouched.
+// A filter does not have to support this and can fail to connect with a
+// media type where rcSource and rcTarget are not empty.
+//
+// Your output pin is connected to the next filter with a certain media
+// type (either directly or using the media type passed by SetFormat),
+// and you need to look at the AvgBytesPerSecond field of the format
+// of that mediatype to see what data rate you are being asked to compress
+// the video to, and use that data rate. Using the number of frames per
+// second in AvgTimePerFrame, you can figure out how many bytes each frame
+// is supposed to be. You can make it smaller, but NEVER EVER make a bigger
+// data rate. For a video compressor, your input pin's media type tells you
+// the frame rate (use that AvgTimePerFrame). For a capture filter, the
+// output media type tells you, so use that AvgTimePerFrame.
+//
+// The cropping rectangle described below is the same as the rcSrc of the
+// output pin's media type.
+//
+// The output rectangle described below is the same of the width and height
+// of the BITMAPINFOHEADER of the media type of the output pin's media type
+
+
+// AUDIO EXAMPLE
+//
+// This API can return an array of pairs of (media type, capabilities).
+// This can be used to expose all kinds of wierd capabilities. Let's say you
+// do any PCM frequency from 11,025 to 44,100 at 8 or 16 bit mono or
+// stereo, and you also do 48,000 16bit stereo as a special combination.
+// You would expose 3 pairs. The first pair would have Min Freq of 11025 and
+// Max Freq of 44100, with MaxChannels=2 and MinBits=8 and MaxBits=8 for the
+// capabilites structure, and a media type of anything you like, maybe
+// 22kHz, 8bit stereo as a default.
+// The 2nd pair would be the same except for MinBits=16 and MaxBits=16 in
+// the capabilities structure and the media type could be something like
+// 44kHz, 16bit stereo as a default (the media type in the pair should always
+// be something legal as described by the capabilities structure... the
+// structure tells you how you can change the media type to produce other
+// legal media types... for instance changing 44kHz to 29010Hz would be legal,
+// but changing bits from 16 to 14 would not be.)
+// The 3rd pair would be MinFreq=48000 MaxFreq=48000 MaxChannels=2
+// MinBits=16 and MaxBits=16, and the media type would be 48kHz 16bit stereo.
+// You can also use the Granularity elements of the structure (like the example
+// for video) if you support values that multiples of n, eg. you could say
+// minimum bits per sample 8, max 16, and granularity 8 to describe doing
+// either 8 or 16 bit all in one structure
+//
+// If you support non-PCM formats, the media type returned in GetStreamCaps
+// can show which non-PCM formats you support (with a default sample rate,
+// bit rate and channels) and the capabilities structure going with that
+// media type can describe which other sample rates, bit rates and channels
+// you support.
+
+[
+ object,
+ uuid(C6E13340-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+]
+interface IAMStreamConfig : IUnknown
+{
+
+ // this is the structure returned by a VIDEO filter
+ //
+ typedef struct _VIDEO_STREAM_CONFIG_CAPS {
+
+ GUID guid; // will be MEDIATYPE_Video
+
+ // the logical or of all the AnalogVideoStandard's supported
+ // typically zero if not supported
+ ULONG VideoStandard;
+
+ // the inherent size of the incoming signal... taken from the input
+ // pin for a compressor, or the largest size a capture filter can
+ // digitize the signal with every pixel still unique
+ SIZE InputSize;
+
+ // The input of a compressor filter may have to be connected for these
+ // to be known
+
+ // smallest rcSrc cropping rect allowed
+ SIZE MinCroppingSize;
+ // largest rcSrc cropping rect allowed
+ SIZE MaxCroppingSize;
+ // granularity of cropping size - eg only widths a multiple of 4 allowed
+ int CropGranularityX;
+ int CropGranularityY;
+ // alignment of cropping rect - eg rect must start on multiple of 4
+ int CropAlignX;
+ int CropAlignY;
+
+ // The input of a compressor filter may have to be connected for these
+ // to be known
+
+ // smallest bitmap this pin can produce
+ SIZE MinOutputSize;
+ // largest bitmap this pin can produce
+ SIZE MaxOutputSize;
+ // granularity of output bitmap size
+ int OutputGranularityX;
+ int OutputGranularityY;
+ // !!! what about alignment of rcTarget inside BIH if different?
+
+ // how well can you stretch in the x direction? 0==not at all
+ // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation
+ // etc.
+ int StretchTapsX;
+ int StretchTapsY;
+ // how well can you shrink in the x direction? 0==not at all
+ // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation
+ // etc.
+ int ShrinkTapsX;
+ int ShrinkTapsY;
+
+ // CAPTURE filter only - what frame rates are allowed?
+ LONGLONG MinFrameInterval;
+ LONGLONG MaxFrameInterval;
+
+ // what data rates can this pin produce?
+ LONG MinBitsPerSecond;
+ LONG MaxBitsPerSecond;
+ } VIDEO_STREAM_CONFIG_CAPS;
+
+
+ // this is the structure returned by an AUDIO filter
+ //
+ typedef struct _AUDIO_STREAM_CONFIG_CAPS {
+
+ GUID guid; // will be MEDIATYPE_Audio
+ ULONG MinimumChannels;
+ ULONG MaximumChannels;
+ ULONG ChannelsGranularity;
+ ULONG MinimumBitsPerSample;
+ ULONG MaximumBitsPerSample;
+ ULONG BitsPerSampleGranularity;
+ ULONG MinimumSampleFrequency;
+ ULONG MaximumSampleFrequency;
+ ULONG SampleFrequencyGranularity;
+ } AUDIO_STREAM_CONFIG_CAPS;
+
+ // - only allowed when pin is not streaming, else the call will FAIL
+ // - If your output pin is not yet connected, and you can
+ // connect your output pin with this media type, you should
+ // succeed the call, and start offering it first (enumerate as format#0)
+ // from GetMediaType so that this format will be used to connect with
+ // when you do connect to somebody
+ // - if your output pin is already connected, and you can provide this
+ // type, reconnect your pin. If the other pin can't accept it, FAIL
+ // this call and leave your connection alone.
+ HRESULT SetFormat(
+ [in] AM_MEDIA_TYPE *pmt);
+
+ // the format it's connected with, or will connect with
+ // the application is responsible for calling DeleteMediaType(*ppmt);
+ HRESULT GetFormat(
+ [out] AM_MEDIA_TYPE **ppmt);
+
+ // how many different Stream Caps structures are there?
+ // also, how big is the stream caps structure?
+ HRESULT GetNumberOfCapabilities(
+ [out] int *piCount,
+ [out] int *piSize); // pSCC of GetStreamCaps needs to be this big
+
+ // - gets one of the pairs of {Mediatype, Caps}
+ // - return S_FALSE if iIndex is too high
+ // - the application is responsible for calling DeleteMediaType(*ppmt);
+ // - the first thing pSCC points to is a GUID saying MEDIATYPE_Video
+ // or MEDIATYPE_Audio, so you can tell if you have a pointer to a
+ // VIDEO_STREAM_CONFIG_CAPS or an AUDIO_STREAM_CONFIG_CAPS structure
+ // There could potentially be many more possibilities other than video
+ // or audio.
+ HRESULT GetStreamCaps(
+ [in] int iIndex, // 0 to #caps-1
+ [out] AM_MEDIA_TYPE **ppmt,
+ [out] BYTE *pSCC);
+
+}
+
+
+
+// Interface to control interleaving of different streams in one file
+[
+object,
+uuid(BEE3D220-157B-11d0-BD23-00A0C911CE86),
+pointer_default(unique)
+]
+interface IConfigInterleaving : IUnknown
+{
+ import "unknwn.idl";
+
+ typedef enum
+ {
+ // uninterleaved - samples written out in the order they
+ // arrive.
+ INTERLEAVE_NONE,
+
+ // approximate interleaving with less overhead for video
+ // capture
+ INTERLEAVE_CAPTURE,
+
+ // full, precise interleaving. slower.
+ INTERLEAVE_FULL,
+
+ // samples written out in the order they arrive. writes are
+ // buffered
+ INTERLEAVE_NONE_BUFFERED
+
+ } InterleavingMode;
+
+ HRESULT put_Mode(
+ [in] InterleavingMode mode
+ );
+
+ HRESULT get_Mode(
+ [out] InterleavingMode *pMode
+ );
+
+ HRESULT put_Interleaving(
+ [in] const REFERENCE_TIME *prtInterleave,
+ [in] const REFERENCE_TIME *prtPreroll
+ );
+
+ HRESULT get_Interleaving(
+ [out] REFERENCE_TIME *prtInterleave,
+ [out] REFERENCE_TIME *prtPreroll
+ );
+}
+
+// Interface to control the AVI mux
+[
+object,
+uuid(5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6),
+pointer_default(unique)
+]
+interface IConfigAviMux : IUnknown
+{
+ import "unknwn.idl";
+
+ // control whether the AVI mux adjusts the frame rate or audio
+ // sampling rate for drift when the file is closed. -1 to disables
+ // this behavior.
+ HRESULT SetMasterStream([in] LONG iStream);
+ HRESULT GetMasterStream([out] LONG *pStream);
+
+ // control whether the AVI mux writes out an idx1 index chunk for
+ // compatibility with older AVI players.
+ HRESULT SetOutputCompatibilityIndex([in] BOOL fOldIndex);
+ HRESULT GetOutputCompatibilityIndex([out] BOOL *pfOldIndex);
+}
+
+ //---------------------------------------------------------------------
+ // CompressionCaps enum
+ //---------------------------------------------------------------------
+
+ // This tells you which features of IAMVideoCompression are supported
+
+ // CanCrunch means that it can compress video to a specified data rate
+ // If so, then the output pin's media type will contain that data rate
+ // in the format's AvgBytesPerSecond field, and that should be used.
+
+ typedef enum
+ {
+ CompressionCaps_CanQuality = 0x01,
+ CompressionCaps_CanCrunch = 0x02,
+ CompressionCaps_CanKeyFrame = 0x04,
+ CompressionCaps_CanBFrame = 0x08,
+ CompressionCaps_CanWindow = 0x10
+ } CompressionCaps;
+
+
+
+ //---------------------------------------------------------------------
+ // IAMVideoCompression interface
+ //
+ // Control compression parameters - pin interface
+ //---------------------------------------------------------------------
+
+ // This interface is implemented by the output pin of a video capture
+ // filter or video compressor that provides video data
+
+ // You use this interface to control how video is compressed... how
+ // many keyframes, etc., and to find information like capabilities and
+ // the description of this compressor
+
+ [
+ object,
+ uuid(C6E13343-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMVideoCompression : IUnknown
+ {
+ // - Only valid if GetInfo's pCapabilities sets
+ // CompressionCaps_CanKeyFrame
+ // - KeyFrameRate < 0 means use the compressor default
+ // - KeyFrames == 0 means only the first frame is a key
+ HRESULT put_KeyFrameRate (
+ [in] long KeyFrameRate);
+
+ HRESULT get_KeyFrameRate (
+ [out] long * pKeyFrameRate);
+
+ // - Only valid if GetInfo's pCapabilities sets
+ // CompressionCaps_CanBFrame
+ // - If keyframes are every 10, and there are 3 P Frames per key,
+ // they will be spaced evenly between the key frames and the other
+ // 6 frames will be B frames
+ // - PFramesPerKeyFrame < 0 means use the compressor default
+ HRESULT put_PFramesPerKeyFrame (
+ [in] long PFramesPerKeyFrame);
+
+ HRESULT get_PFramesPerKeyFrame (
+ [out] long * pPFramesPerKeyFrame);
+
+ // - Only valid if GetInfo's pCapabilities sets
+ // CompressionCaps_CanQuality
+ // - Controls image quality
+ // - If you are compressing to a fixed data rate, a high quality
+ // means try and use all of the data rate, and a low quality means
+ // feel free to use much lower than the data rate if you want to.
+ // - Quality < 0 means use the compressor default
+ HRESULT put_Quality (
+ [in] double Quality);
+
+ HRESULT get_Quality (
+ [out] double * pQuality);
+
+ // If you have set a data rate of 100K/sec on a 10fps movie, that
+ // will normally mean each frame must be <=10K. But a window size
+ // means every consecutive n frames must average to the data rate,
+ // but an individual frame (if n > 1) is allowed to exceed the
+ // frame size suggested by the data rate
+ HRESULT put_WindowSize (
+ [in] DWORDLONG WindowSize);
+
+ HRESULT get_WindowSize (
+ [out] DWORDLONG * pWindowSize);
+
+ // - pszVersion might be "Version 2.1.0"
+ // - pszDescription might be "Danny's awesome video compressor"
+ // - pcbVersion and pcbDescription will be filled in with the
+ // required length if they are too short
+ // - *pCapabilities is a logical OR of some CompressionCaps flags
+ HRESULT GetInfo(
+ [out, size_is(*pcbVersion)] WCHAR * pszVersion,
+ [in,out] int *pcbVersion,
+ [out, size_is(*pcbDescription)] LPWSTR pszDescription,
+ [in,out] int *pcbDescription,
+ [out] long *pDefaultKeyFrameRate,
+ [out] long *pDefaultPFramesPerKey,
+ [out] double *pDefaultQuality,
+ [out] long *pCapabilities //CompressionCaps
+ );
+
+ // - this means when this frame number comes along after the graph
+ // is running, make it a keyframe even if you weren't going to
+ HRESULT OverrideKeyFrame(
+ [in] long FrameNumber
+ );
+
+ // - Only valid if GetInfo's pCapabilities sets
+ // CompressionCaps_CanCrunch
+ // - this means when this frame number comes along after the graph
+ // is running, make it this many bytes big instead of whatever size
+ // you were going to make it.
+ HRESULT OverrideFrameSize(
+ [in] long FrameNumber,
+ [in] long Size
+ );
+
+ }
+
+ //---------------------------------------------------------------------
+ // VfwCaptureDialogs enum
+ //---------------------------------------------------------------------
+
+ typedef enum
+ {
+ VfwCaptureDialog_Source = 0x01,
+ VfwCaptureDialog_Format = 0x02,
+ VfwCaptureDialog_Display = 0x04
+ } VfwCaptureDialogs;
+
+
+ //---------------------------------------------------------------------
+ // VfwCompressDialogs enum
+ //---------------------------------------------------------------------
+
+ typedef enum
+ {
+ VfwCompressDialog_Config = 0x01,
+ VfwCompressDialog_About = 0x02,
+ // returns S_OK if the dialog exists and can be shown, else S_FALSE
+ VfwCompressDialog_QueryConfig = 0x04,
+ VfwCompressDialog_QueryAbout = 0x08
+ } VfwCompressDialogs;
+
+
+ //---------------------------------------------------------------------
+ // IAMVfwCaptureDialogs - filter interface
+ //
+ // Show a VfW capture driver dialog - SOURCE, FORMAT, or DISPLAY
+ //---------------------------------------------------------------------
+
+ // This interface is supported only by Microsoft's Video For Windows
+ // capture driver Capture Filter. It allows an application to bring up
+ // one of the 3 driver dialogs that VfW capture drivers have.
+
+ [
+ object,
+ local,
+ uuid(D8D715A0-6E5E-11D0-B3F0-00AA003761C5),
+ pointer_default(unique)
+ ]
+ interface IAMVfwCaptureDialogs : IUnknown
+ {
+ HRESULT HasDialog(
+ [in] int iDialog // VfwCaptureDialogs enum
+ );
+
+ HRESULT ShowDialog(
+ [in] int iDialog, // VfwCaptureDialogs enum
+ [in] HWND hwnd
+ );
+
+ HRESULT SendDriverMessage(
+ [in] int iDialog, // VfwCaptureDialogs enum
+ [in] int uMsg,
+ [in] long dw1,
+ [in] long dw2
+ );
+
+ // - iDialog can be one of the VfwCaptureDialogs enums
+ // - HasDialog returns S_OK if it has the dialog, else S_FALSE
+ // - ShowDialog can only be called when not streaming or when another
+ // dialog is not already up
+ // - SendDriverMessage can send a private message to the capture driver.
+ // USE IT AT YOUR OWN RISK!
+ }
+
+ //---------------------------------------------------------------------
+ // IAMVfwCompressDialogs - filter interface
+ //
+ // Show a VfW codec driver dialog - CONFIG or ABOUT
+ //---------------------------------------------------------------------
+
+ // This interface is supported only by Microsoft's ICM Compressor filter
+ // (Co). It allows an application to bring up either the Configure or
+ // About dialogs for the ICM codec that it is currently using.
+
+ [
+ object,
+ local,
+ uuid(D8D715A3-6E5E-11D0-B3F0-00AA003761C5),
+ pointer_default(unique)
+ ]
+ interface IAMVfwCompressDialogs : IUnknown
+ {
+
+ // Bring up a dialog for this codec
+ HRESULT ShowDialog(
+ [in] int iDialog, // VfwCompressDialogs enum
+ [in] HWND hwnd
+ );
+
+ // Calls ICGetState and gives you the result
+ HRESULT GetState(
+ [out, size_is(*pcbState)] LPVOID pState,
+ [in, out] int *pcbState
+ );
+
+ // Calls ICSetState
+ HRESULT SetState(
+ [in, size_is(cbState)] LPVOID pState,
+ [in] int cbState
+ );
+
+ // Send a codec specific message
+ HRESULT SendDriverMessage(
+ [in] int uMsg,
+ [in] long dw1,
+ [in] long dw2
+ );
+
+ // - iDialog can be one of the VfwCaptureDialogs enums
+ // - ShowDialog can only be called when not streaming or when no other
+ // dialog is up already
+ // - an application can call GetState after ShowDialog(CONFIG) to
+ // see how the compressor was configured and next time the graph
+ // is used, it can call SetState with the data it saved to return
+ // the codec to the state configured by the dialog box from last time
+ // - GetState with a NULL pointer returns the size needed
+ // - SendDriverMessage can send a private message to the codec.
+ // USE IT AT YOUR OWN RISK!
+ }
+
+
+ //---------------------------------------------------------------------
+ // IAMDroppedFrames interface
+ //
+ // Report status of capture - pin interface
+ //---------------------------------------------------------------------
+
+ // A capture filter's video output pin supports this. It reports
+ // how many frames were not sent (dropped), etc.
+
+ // Every time your filter goes from STOPPED-->PAUSED, you reset all your
+ // counts to zero.
+
+ // An app may call this all the time while you are capturing to see how
+ // capturing is going. MAKE SURE you always return as current information
+ // as possible while you are running.
+
+ // When your capture filter starts running, it starts by sending frame 0,
+ // then 1, 2, 3, etc. The time stamp of each frame sent should correspond
+ // to the graph clock's time when the image was digitized. The end time
+ // is the start time plus the duration of the video frame.
+ // You should also set the MediaTime of each sample (SetMediaTime) as well.
+ // This should be the frame number ie (0,1) (1,2) (2,3).
+ // If a frame is dropped, a downstream filter will be able to tell easily
+ // not by looking for gaps in the regular time stamps, but by noticing a
+ // frame number is missing (eg. (1,2) (2,3) (4,5) (5,6) means frame 3
+ // was dropped.
+
+ // Using the info provided by this interface, an application can figure out
+ // the number of frames dropped, the frame rate achieved (the length of
+ // time the graph was running divided by the number of frames not dropped),
+ // and the data rate acheived (the length of time the graph was running
+ // divided by the average frame size).
+
+ // If your filter is running, then paused, and then run again, you need
+ // to continue to deliver frames as if it was never paused. The first
+ // frame after the second RUN cannot be time stamped earlier than the last
+ // frame sent before the pause.
+
+ // Your filter must always increment the MediaTime of each sample sent.
+ // Never send the same frame # twice, and never go back in time. The
+ // regular time stamp of a sample can also never go back in time.
+
+ [
+ object,
+ uuid(C6E13344-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMDroppedFrames : IUnknown
+ {
+ // Get the number of dropped frames
+ HRESULT GetNumDropped(
+ [out] long * plDropped
+
+ );
+
+ //Get the number of non-dropped frames
+ HRESULT GetNumNotDropped(
+ [out] long * plNotDropped
+
+ );
+
+ // - plArray points to an array of lSize longs. The filter will
+ // fill it with the frame number of the first lSize frames dropped.
+ // A filter may not have bothered to remember as many as you asked
+ // for, so it will set *plNumCopied to the number of frames it filled
+ // in.
+ HRESULT GetDroppedInfo(
+ [in] long lSize,
+ [out] long * plArray,
+ [out] long * plNumCopied
+ );
+
+ // - This is the average size of the frames it didn't drop (in bytes)
+ HRESULT GetAverageFrameSize(
+ [out] long * plAverageSize
+
+ );
+
+ }
+
+
+
+ cpp_quote("#define AMF_AUTOMATICGAIN -1.0")
+
+ //---------------------------------------------------------------------
+ // IAMAudioInputMixer interface
+ //
+ // Sets the recording levels, pan and EQ for the audio card inputs
+ //---------------------------------------------------------------------
+
+ // This interface is implemented by each input pin of an audio capture
+ // filter, to tell it what level, panning, and EQ to use for each input.
+ // The name of each pin will reflect the type of input, eg. "Line input 1"
+ // or "Mic". An application uses the pin names to decide how it wants to
+ // set the recording levels
+
+ // This interface can also be supported by the audio capture filter itself
+ // to control to overall record level and panning after the mix
+
+ [
+ object,
+ uuid(54C39221-8380-11d0-B3F0-00AA003761C5),
+ pointer_default(unique)
+ ]
+ interface IAMAudioInputMixer : IUnknown
+ {
+ // This interface is only supported by the input pins, not the filter
+ // If disabled, this channel will not be mixed in as part of the
+ // recorded signal.
+ HRESULT put_Enable (
+ [in] BOOL fEnable); // TRUE=enable FALSE=disable
+
+ //Is this channel enabled?
+ HRESULT get_Enable (
+ [out] BOOL *pfEnable);
+
+ // When set to mono mode, making a stereo recording of this channel
+ // will have both channels contain the same data... a mixture of the
+ // left and right signals
+ HRESULT put_Mono (
+ [in] BOOL fMono); // TRUE=mono FALSE=multi channel
+
+ //all channels combined into a mono signal?
+ HRESULT get_Mono (
+ [out] BOOL *pfMono);
+
+ // !!! WILL CARDS BE ABLE TO BOOST THE GAIN?
+ //Set the record level for this channel
+ HRESULT put_MixLevel (
+ [in] double Level); // 0 = off, 1 = full (unity?) volume
+ // AMF_AUTOMATICGAIN, if supported,
+ // means automatic
+
+ //Get the record level for this channel
+ HRESULT get_MixLevel (
+ [out] double *pLevel);
+
+ // For instance, when panned full left, and you make a stereo recording
+ // of this channel, you will record a silent right channel.
+ HRESULT put_Pan (
+ [in] double Pan); // -1 = full left, 0 = centre, 1 = right
+
+ //Get the pan for this channel
+ HRESULT get_Pan (
+ [out] double *pPan);
+
+ // Boosts the bass of low volume signals before they are recorded
+ // to compensate for the fact that your ear has trouble hearing quiet
+ // bass sounds
+ HRESULT put_Loudness (
+ [in] BOOL fLoudness);// TRUE=on FALSE=off
+
+ HRESULT get_Loudness (
+ [out] BOOL *pfLoudness);
+
+ // boosts or cuts the treble of the signal before it's recorded by
+ // a certain amount of dB
+ HRESULT put_Treble (
+ [in] double Treble); // gain in dB (-ve = attenuate)
+
+ //Get the treble EQ for this channel
+ HRESULT get_Treble (
+ [out] double *pTreble);
+
+ // This is the maximum value allowed in put_Treble. ie 6.0 means
+ // any value between -6.0 and 6.0 is allowed
+ HRESULT get_TrebleRange (
+ [out] double *pRange); // largest value allowed
+
+ // boosts or cuts the bass of the signal before it's recorded by
+ // a certain amount of dB
+ HRESULT put_Bass (
+ [in] double Bass); // gain in dB (-ve = attenuate)
+
+ // Get the bass EQ for this channel
+ HRESULT get_Bass (
+ [out] double *pBass);
+
+ // This is the maximum value allowed in put_Bass. ie 6.0 means
+ // any value between -6.0 and 6.0 is allowed
+ HRESULT get_BassRange (
+ [out] double *pRange); // largest value allowed
+
+ }
+
+
+ //---------------------------------------------------------------------
+ // IAMBufferNegotiation interface
+ //
+ // Tells a pin what kinds of buffers to use when connected
+ //---------------------------------------------------------------------
+
+ // This interface can be implemented by any pin that will connect to
+ // another pin using IMemInputPin. All capture filters should support
+ // this interface.
+
+ // SuggestAllocatorProperties is a way for an application to get
+ // in on the buffer negotiation process for a pin. This pin will use
+ // the numbers given to it by the application as its request to the
+ // allocator. An application can use a negative number for any element
+ // in the ALLOCATOR_PROPERTIES to mean "don't care". An application must
+ // call this function before the pin is connected, or it will be too late
+ // To ensure that an application gets what it wants, it would be wise to
+ // call this method on both pins being connected together, so the other
+ // pin doesn't overrule the application's request.
+
+ // GetAllocatorProperties can only be called after a pin is connected and
+ // it returns the properties of the current allocator being used
+
+ [
+ object,
+ uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5),
+ pointer_default(unique)
+ ]
+ interface IAMBufferNegotiation : IUnknown
+ {
+ HRESULT SuggestAllocatorProperties (
+ [in] const ALLOCATOR_PROPERTIES *pprop);
+
+ HRESULT GetAllocatorProperties (
+ [out] ALLOCATOR_PROPERTIES *pprop);
+
+ }
+
+
+ //---------------------------------------------------------------------
+ // AnalogVideoStandard enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagAnalogVideoStandard
+ {
+ AnalogVideo_None = 0x00000000, // This is a digital sensor
+ AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup
+ AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup
+ AnalogVideo_NTSC_433 = 0x00000004,
+
+ AnalogVideo_PAL_B = 0x00000010,
+ AnalogVideo_PAL_D = 0x00000020,
+ AnalogVideo_PAL_G = 0x00000040,
+ AnalogVideo_PAL_H = 0x00000080,
+ AnalogVideo_PAL_I = 0x00000100,
+ AnalogVideo_PAL_M = 0x00000200,
+ AnalogVideo_PAL_N = 0x00000400,
+
+ AnalogVideo_PAL_60 = 0x00000800,
+
+ AnalogVideo_SECAM_B = 0x00001000,
+ AnalogVideo_SECAM_D = 0x00002000,
+ AnalogVideo_SECAM_G = 0x00004000,
+ AnalogVideo_SECAM_H = 0x00008000,
+ AnalogVideo_SECAM_K = 0x00010000,
+ AnalogVideo_SECAM_K1 = 0x00020000,
+ AnalogVideo_SECAM_L = 0x00040000,
+ AnalogVideo_SECAM_L1 = 0x00080000,
+
+ AnalogVideo_PAL_N_COMBO // Argentina
+ = 0x00100000
+ } AnalogVideoStandard;
+
+ cpp_quote("#define AnalogVideo_NTSC_Mask 0x00000007")
+ cpp_quote("#define AnalogVideo_PAL_Mask 0x00100FF0")
+ cpp_quote("#define AnalogVideo_SECAM_Mask 0x000FF000")
+
+
+ //---------------------------------------------------------------------
+ // TunerInputType enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagTunerInputType
+ {
+ TunerInputCable,
+ TunerInputAntenna
+ } TunerInputType;
+
+ //---------------------------------------------------------------------
+ // VideoCopyProtectionType enum
+ //---------------------------------------------------------------------
+
+ typedef enum
+ {
+ VideoCopyProtectionMacrovisionBasic,
+ VideoCopyProtectionMacrovisionCBI
+ } VideoCopyProtectionType;
+
+ //---------------------------------------------------------------------
+ // PhysicalConnectorType enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagPhysicalConnectorType
+ {
+ PhysConn_Video_Tuner = 1,
+ PhysConn_Video_Composite,
+ PhysConn_Video_SVideo,
+ PhysConn_Video_RGB,
+ PhysConn_Video_YRYBY,
+ PhysConn_Video_SerialDigital,
+ PhysConn_Video_ParallelDigital,
+ PhysConn_Video_SCSI,
+ PhysConn_Video_AUX,
+ PhysConn_Video_1394,
+ PhysConn_Video_USB,
+ PhysConn_Video_VideoDecoder,
+ PhysConn_Video_VideoEncoder,
+ PhysConn_Video_SCART,
+ PhysConn_Video_Black,
+
+
+ PhysConn_Audio_Tuner = 0x1000,
+ PhysConn_Audio_Line,
+ PhysConn_Audio_Mic,
+ PhysConn_Audio_AESDigital,
+ PhysConn_Audio_SPDIFDigital,
+ PhysConn_Audio_SCSI,
+ PhysConn_Audio_AUX,
+ PhysConn_Audio_1394,
+ PhysConn_Audio_USB,
+ PhysConn_Audio_AudioDecoder,
+ } PhysicalConnectorType;
+
+
+
+
+ //---------------------------------------------------------------------
+ // IAMAnalogVideoDecoder interface
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(C6E13350-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMAnalogVideoDecoder : IUnknown
+ {
+
+ //Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1...
+ HRESULT get_AvailableTVFormats(
+ [out] long *lAnalogVideoStandard
+ );
+
+ //Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...
+ HRESULT put_TVFormat(
+ [in] long lAnalogVideoStandard
+ );
+
+ // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...
+ HRESULT get_TVFormat(
+ [out] long * plAnalogVideoStandard
+ );
+
+ // True if horizontal sync is locked
+ HRESULT get_HorizontalLocked (
+ [out] long * plLocked);
+
+ // True if connected to a VCR (changes PLL timing)
+ HRESULT put_VCRHorizontalLocking (
+ [in] long lVCRHorizontalLocking);
+
+ HRESULT get_VCRHorizontalLocking (
+ [out] long * plVCRHorizontalLocking);
+
+ // Returns the number of lines in the video signal")]
+ HRESULT get_NumberOfLines (
+ [out] long *plNumberOfLines);
+
+ // Enables or disables the output bus
+ HRESULT put_OutputEnable (
+ [in] long lOutputEnable);
+
+ HRESULT get_OutputEnable (
+ [out] long *plOutputEnable);
+
+ }
+
+
+ //---------------------------------------------------------------------
+ // VideoProcAmp Property enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagVideoProcAmpProperty
+ {
+ VideoProcAmp_Brightness,
+ VideoProcAmp_Contrast,
+ VideoProcAmp_Hue,
+ VideoProcAmp_Saturation,
+ VideoProcAmp_Sharpness,
+ VideoProcAmp_Gamma,
+ VideoProcAmp_ColorEnable,
+ VideoProcAmp_WhiteBalance,
+ VideoProcAmp_BacklightCompensation,
+ VideoProcAmp_Gain
+ } VideoProcAmpProperty;
+
+ //---------------------------------------------------------------------
+ // VideoProcAmp Flags enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagVideoProcAmpFlags
+ {
+ VideoProcAmp_Flags_Auto = 0x0001,
+ VideoProcAmp_Flags_Manual = 0x0002
+ } VideoProcAmpFlags;
+
+ //---------------------------------------------------------------------
+ // IAMVideoProcAmp interface
+ //
+ // Adjusts video quality in either the analog or digital domain.
+ //
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(C6E13360-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMVideoProcAmp : IUnknown
+ {
+ // Returns min, max, step size, and default values
+ HRESULT GetRange(
+ [in] long Property, // Which property to query
+ [out] long * pMin, // Range minimum
+ [out] long * pMax, // Range maxumum
+ [out] long * pSteppingDelta,// Step size
+ [out] long * pDefault, // Default value
+ [out] long * pCapsFlags // VideoProcAmpFlags
+
+ );
+
+ // Set a VideoProcAmp property
+ HRESULT Set(
+ [in] long Property, // VideoProcAmpProperty
+ [in] long lValue, // Value to set
+ [in] long Flags // VideoProcAmp_Flags_*
+
+ );
+
+ // Get a VideoProcAmp property
+ HRESULT Get(
+ [in] long Property, // VideoProcAmpProperty
+ [out] long * lValue, // Current value
+ [out] long * Flags // VideoProcAmp_Flags_*
+ );
+ }
+
+
+ //---------------------------------------------------------------------
+ // CameraControl Property enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagCameraControlProperty
+ {
+ CameraControl_Pan,
+ CameraControl_Tilt,
+ CameraControl_Roll,
+ CameraControl_Zoom,
+ CameraControl_Exposure,
+ CameraControl_Iris,
+ CameraControl_Focus
+ } CameraControlProperty;
+
+ //---------------------------------------------------------------------
+ // CameraControl Flags enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagCameraControlFlags
+ {
+ CameraControl_Flags_Auto = 0x0001,
+ CameraControl_Flags_Manual = 0x0002
+ } CameraControlFlags;
+
+ //---------------------------------------------------------------------
+ // IAMCameraControl interface
+ //
+ // Control of local or remote cameras
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(C6E13370-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMCameraControl : IUnknown
+ {
+ // Returns min, max, step size, and default values
+ HRESULT GetRange(
+ [in] long Property, // Which property to query
+ [out] long * pMin, // Range minimum
+ [out] long * pMax, // Range maxumum
+ [out] long * pSteppingDelta,// Step size
+ [out] long * pDefault, // Default value
+ [out] long * pCapsFlags // CamaeraControlFlags
+
+ );
+
+ // Set a CameraControl property
+ HRESULT Set(
+ [in] long Property, // CameraControlProperty
+ [in] long lValue, // Value to set
+ [in] long Flags // CameraControl_Flags_*
+
+ );
+
+ // Get a CameraControl property
+ HRESULT Get(
+ [in] long Property, // CameraControlProperty
+ [out] long * lValue, // Current value
+ [out] long * Flags // CameraControl_Flags_*
+ );
+ }
+
+ //---------------------------------------------------------------------
+ // VideoControl Flags enum
+ //---------------------------------------------------------------------
+
+ typedef enum tagVideoControlFlags
+ {
+ VideoControlFlag_FlipHorizontal = 0x0001,
+ VideoControlFlag_FlipVertical = 0x0002,
+ VideoControlFlag_ExternalTriggerEnable = 0x0004,
+ VideoControlFlag_Trigger = 0x0008
+
+ } VideoControlFlags;
+
+ //---------------------------------------------------------------------
+ // IAMVideoControl interface
+ //
+ // Control of horizontal & vertical flip, external trigger,
+ // and listing available frame rates
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(6a2e0670-28e4-11d0-a18c-00a0c9118956),
+ pointer_default(unique)
+ ]
+ interface IAMVideoControl : IUnknown
+ {
+ // What can the underlying hardware do?
+ HRESULT GetCaps(
+ [in] IPin * pPin, // the pin to query or control
+ [out] long * pCapsFlags // VideoControlFlag_*
+
+ );
+
+ // Set the mode of operation
+ HRESULT SetMode(
+ [in] IPin * pPin, // the pin to query or control
+ [in] long Mode // VideoControlFlag_*
+
+ );
+
+ // Get the mode of operation
+ HRESULT GetMode(
+ [in] IPin * pPin, // the pin to query or control
+ [out] long * Mode // VideoControlFlag_*
+ );
+
+ // Get actual frame rate info for USB and 1394
+ // This is only available when streaming
+ HRESULT GetCurrentActualFrameRate(
+ [in] IPin * pPin, // the pin to query or control
+ [out] LONGLONG * ActualFrameRate // 100 nS units
+ );
+
+ // Get max available frame rate info for USB and 1394
+ // Returns the max frame rate currently available based on bus bandwidth usage
+ HRESULT GetMaxAvailableFrameRate(
+ [in] IPin * pPin, // the pin to query or control
+ [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1
+ [in] SIZE Dimensions, // width and height
+ [out] LONGLONG * MaxAvailableFrameRate // 100 nS units
+ );
+
+ // Get List of available frame rates
+ HRESULT GetFrameRateList(
+ [in] IPin * pPin, // the pin to query or control
+ [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1
+ [in] SIZE Dimensions, // width and height
+ [out] long * ListSize, // Number of elements in the list
+ [out] LONGLONG ** FrameRates // Array of framerates in 100 nS units
+ // or NULL to just get ListSize
+ );
+
+ }
+
+
+ //---------------------------------------------------------------------
+ // IAMCrossbar interface
+ //
+ // Controls a routing matrix for analog or digital video or audio
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(C6E13380-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMCrossbar : IUnknown
+ {
+
+ // How many pins are there?
+ HRESULT get_PinCounts(
+ [out] long * OutputPinCount, // count of output pins
+ [out] long * InputPinCount); // count of input pins
+
+ // True if routing is possible
+ HRESULT CanRoute (
+ [in] long OutputPinIndex, // the output pin
+ [in] long InputPinIndex); // the input pin
+
+ // Routes an input pin to an output pin
+ HRESULT Route (
+ [in] long OutputPinIndex, // the output pin
+ [in] long InputPinIndex); // the input pin
+
+ // Returns the input pin connected to a given output pin
+ HRESULT get_IsRoutedTo (
+ [in] long OutputPinIndex, // the output pin
+ [out] long * InputPinIndex); // the connected input pin
+
+ // Returns a pin which is related to a given pin
+ // (ie. this audio pin is related to a video pin)
+ HRESULT get_CrossbarPinInfo (
+ [in] BOOL IsInputPin, // TRUE for input pins
+ [in] long PinIndex, // a pin
+ [out] long * PinIndexRelated, // Index of related pin
+ [out] long * PhysicalType); // Physical type of pin
+
+ }
+
+
+ //---------------------------------------------------------------------
+ // IAMTuner interface
+ //
+ // base tuner device
+ //---------------------------------------------------------------------
+
+ // predefined subchannel values
+ typedef enum tagAMTunerSubChannel
+ {
+ AMTUNER_SUBCHAN_NO_TUNE = -2, // don't tune
+ AMTUNER_SUBCHAN_DEFAULT = -1 // use default sub chan
+ } AMTunerSubChannel;
+
+ // predefined signal strength values
+ typedef enum tagAMTunerSignalStrength
+ {
+ AMTUNER_HASNOSIGNALSTRENGTH = -1, // cannot indicate signal strength
+ AMTUNER_NOSIGNAL = 0, // no signal available
+ AMTUNER_SIGNALPRESENT = 1 // signal present
+ } AMTunerSignalStrength;
+
+ // specifies the mode of operation of the tuner
+ typedef enum tagAMTunerModeType
+ {
+ AMTUNER_MODE_DEFAULT = 0x0000, // default tuner mode
+ AMTUNER_MODE_TV = 0x0001, // tv
+ AMTUNER_MODE_FM_RADIO = 0x0002, // fm radio
+ AMTUNER_MODE_AM_RADIO = 0x0004, // am radio
+ AMTUNER_MODE_DSS = 0x0008, // dss
+ } AMTunerModeType;
+
+ // Events reported by IAMTunerNotification
+ typedef enum tagAMTunerEventType{
+ AMTUNER_EVENT_CHANGED = 0x0001, // status changed
+ } AMTunerEventType;
+
+ interface IAMTunerNotification;
+
+ [
+ object,
+ uuid(211A8761-03AC-11d1-8D13-00AA00BD8339),
+ pointer_default(unique)
+ ]
+ interface IAMTuner : IUnknown
+ {
+ // Sets and gets the Channel
+ HRESULT put_Channel(
+ [in] long lChannel,
+ [in] long lVideoSubChannel,
+ [in] long lAudioSubChannel
+ );
+ HRESULT get_Channel(
+ [out] long *plChannel,
+ [out] long *plVideoSubChannel,
+ [out] long *plAudioSubChannel
+ );
+
+ // Gets the minimum and maximum channel available
+ HRESULT ChannelMinMax(
+ [out] long *lChannelMin,
+ [out] long *lChannelMax
+ );
+
+ // CountryCode is the same as the international
+ // long distance telephone dialing prefix
+
+ HRESULT put_CountryCode(
+ [in] long lCountryCode
+ );
+ HRESULT get_CountryCode(
+ [out] long *plCountryCode
+ );
+
+ HRESULT put_TuningSpace(
+ [in] long lTuningSpace
+ );
+ HRESULT get_TuningSpace(
+ [out] long *plTuningSpace
+ );
+
+ [local] HRESULT Logon(
+ [in] HANDLE hCurrentUser
+ );
+ HRESULT Logout();
+
+ // Signal status for current channel
+ // signal strength == TUNER_NOSIGNAL, or strength value
+ HRESULT SignalPresent(
+ [out] long * plSignalStrength // AMTunerSignalStrength
+ );
+
+ // allow multifunction tuner to be switch between modes
+ HRESULT put_Mode(
+ [in] AMTunerModeType lMode // AMTunerModeType
+ );
+ HRESULT get_Mode(
+ [out] AMTunerModeType *plMode // AMTunerModeType
+ );
+
+ // retrieve a bitmask of the possible modes
+ HRESULT GetAvailableModes(
+ [out] long *plModes // AMTunerModeType
+ );
+
+ // allow IAMTuner clients to receive event notification
+ HRESULT RegisterNotificationCallBack(
+ [in] IAMTunerNotification *pNotify,
+ [in] long lEvents // bitmask from AMTunerEventType enumeration
+ );
+ HRESULT UnRegisterNotificationCallBack(
+ [in] IAMTunerNotification *pNotify
+ );
+ }
+
+ //---------------------------------------------------------------------
+ // IAMTunerNotification interface
+ //
+ // Provided to IAMTuner if notification callbacks are desired
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(211A8760-03AC-11d1-8D13-00AA00BD8339),
+ pointer_default(unique)
+ ]
+ interface IAMTunerNotification : IUnknown
+ {
+ HRESULT OnEvent([in] AMTunerEventType Event);
+ }
+
+
+ //---------------------------------------------------------------------
+ // IAMTVTuner interface
+ //
+ // Controls an analog TV tuner device
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(211A8766-03AC-11d1-8D13-00AA00BD8339),
+ pointer_default(unique)
+ ]
+ interface IAMTVTuner : IAMTuner
+ {
+ // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...
+ HRESULT get_AvailableTVFormats(
+ [out] long *lAnalogVideoStandard
+ );
+
+ // Gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...)
+ HRESULT get_TVFormat(
+ [out] long * plAnalogVideoStandard
+ );
+
+ // Scans for a signal on a given channel
+ // NOTE: this is equivalent to put_Channel(), SignalStrength()
+ HRESULT AutoTune(
+ [in] long lChannel,
+ [out] long * plFoundSignal
+ );
+
+ // Saves the fine tuning information for all channels")]
+ HRESULT StoreAutoTune();
+
+ // The number of TV sources plugged into the tuner
+ HRESULT get_NumInputConnections(
+ [out] long * plNumInputConnections
+ );
+
+ // Sets or gets the tuner input type (Cable or Antenna)
+ HRESULT put_InputType(
+ [in] long lIndex,
+ [in] TunerInputType InputType
+ );
+ HRESULT get_InputType(
+ [in] long lIndex,
+ [out] TunerInputType * pInputType
+ );
+
+ // Sets or gets the tuner input
+ HRESULT put_ConnectInput(
+ [in] long lIndex
+ );
+ HRESULT get_ConnectInput(
+ [out] long *plIndex
+ );
+
+ // Gets the video and audio carrier frequencies
+ HRESULT get_VideoFrequency(
+ [out] long *lFreq
+ );
+ HRESULT get_AudioFrequency(
+ [out] long *lFreq
+ );
+ }
+
+
+ //---------------------------------------------------------------------
+ // IBPCSatelliteTuner interface
+ //
+ // An interface supporting Satellite tuning-related functions
+ //---------------------------------------------------------------------
+ [
+ object,
+ local,
+ uuid(211A8765-03AC-11d1-8D13-00AA00BD8339),
+ pointer_default(unique)
+ ]
+ interface IBPCSatelliteTuner : IAMTuner
+ {
+ HRESULT get_DefaultSubChannelTypes(
+ [out] long *plDefaultVideoType, // Provider-specific service type
+ [out] long *plDefaultAudioType // Provider-specific service type
+ );
+
+ HRESULT put_DefaultSubChannelTypes(
+ [in] long lDefaultVideoType, // Provider-specific service type
+ [in] long lDefaultAudioType // Provider-specific service type
+ );
+
+ HRESULT IsTapingPermitted(); // S_OK yes, S_FALSE no
+ }
+
+
+
+ //---------------------------------------------------------------------
+ // IAMTVAudio interface
+ //
+ // TV Audio control
+ //---------------------------------------------------------------------
+
+ typedef enum tagTVAudioMode
+ {
+ AMTVAUDIO_MODE_MONO = 0x0001, // Mono
+ AMTVAUDIO_MODE_STEREO = 0x0002, // Stereo
+ AMTVAUDIO_MODE_LANG_A = 0x0010, // Primary language
+ AMTVAUDIO_MODE_LANG_B = 0x0020, // 2nd avail language
+ AMTVAUDIO_MODE_LANG_C = 0x0040, // 3rd avail language
+ } TVAudioMode;
+
+ // Events reported by IAMTVAudioNotification
+ typedef enum tagAMTVAudioEventType
+ {
+ AMTVAUDIO_EVENT_CHANGED = 0x0001, // mode changed
+ } AMTVAudioEventType;
+
+ interface IAMTVAudioNotification;
+
+ [
+ object,
+ local,
+ uuid(83EC1C30-23D1-11d1-99E6-00A0C9560266),
+ pointer_default(unique)
+ ]
+ interface IAMTVAudio : IUnknown
+ {
+ // retrieve a bitmask of the formats available in the hardware
+ HRESULT GetHardwareSupportedTVAudioModes(
+ [out] long *plModes // TVAudioMode
+ );
+
+ // retrieve a bitmask of the possible modes
+ HRESULT GetAvailableTVAudioModes(
+ [out] long *plModes // TVAudioMode
+ );
+
+ HRESULT get_TVAudioMode(
+ [out] long *plMode // TVAudioMode
+ );
+ HRESULT put_TVAudioMode(
+ [in] long lMode // TVAudioMode
+ );
+
+ // allow IAMTVAudio clients to receive event notification
+ HRESULT RegisterNotificationCallBack(
+ [in] IAMTunerNotification *pNotify,
+ [in] long lEvents // bitmask from AMTVAudioEventType enumeration
+ );
+ HRESULT UnRegisterNotificationCallBack(
+ IAMTunerNotification *pNotify
+ );
+ }
+
+ //---------------------------------------------------------------------
+ // IAMTVAudioNotification interface
+ //
+ // Provided to IAMTVAudio clients if notification callbacks are desired
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ local,
+ uuid(83EC1C33-23D1-11d1-99E6-00A0C9560266),
+ pointer_default(unique)
+ ]
+ interface IAMTVAudioNotification : IUnknown
+ {
+ HRESULT OnEvent([in] AMTVAudioEventType Event);
+ }
+
+
+
+
+ //---------------------------------------------------------------------
+ // IAMAnalogVideoEncoder interface
+ //---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(C6E133B0-30AC-11d0-A18C-00A0C9118956),
+ pointer_default(unique)
+ ]
+ interface IAMAnalogVideoEncoder : IUnknown
+ {
+ // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...)
+ HRESULT get_AvailableTVFormats(
+ [out] long *lAnalogVideoStandard
+ );
+
+ // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...)
+ HRESULT put_TVFormat(
+ [in] long lAnalogVideoStandard
+ );
+
+ HRESULT get_TVFormat(
+ [out] long * plAnalogVideoStandard
+ );
+
+ // Sets or gets the copy protection
+ HRESULT put_CopyProtection (
+ [in] long lVideoCopyProtection); // VideoCopyProtectionType
+
+ HRESULT get_CopyProtection (
+ [out] long *lVideoCopyProtection); // VideoCopyProtectionType
+
+
+ // Enables and disables close captioning
+ HRESULT put_CCEnable (
+ [in] long lCCEnable);
+
+ HRESULT get_CCEnable (
+ [out] long *lCCEnable);
+
+ }
+
+ // used by IKsPropertySet set AMPROPSETID_Pin
+ typedef enum {
+ AMPROPERTY_PIN_CATEGORY,
+ AMPROPERTY_PIN_MEDIUM
+ } AMPROPERTY_PIN;
+
+ //---------------------------------------------------------------------
+ // IKsPropertySet interface
+ //
+ // Sets or gets a property identified by a property set GUID and a
+ // property ID.
+ //
+ // Return codes for all 3 methods:
+ // E_PROP_SET_UNSUPPORTED the property set is not supported
+ // E_PROP_ID_UNSUPPORTED the property ID is not supported
+ // for the specified property set
+ //---------------------------------------------------------------------
+
+cpp_quote("#ifndef _IKsPropertySet_")
+cpp_quote("#define _IKsPropertySet_")
+
+ //---------------------------------------------------------------------
+ // #defines for IKsPropertySet::QuerySupported return result in pTypeSupport
+ //---------------------------------------------------------------------
+
+cpp_quote("#define KSPROPERTY_SUPPORT_GET 1")
+cpp_quote("#define KSPROPERTY_SUPPORT_SET 2")
+
+
+ [
+ object,
+ uuid(31EFAC30-515C-11d0-A9AA-00AA0061BE93),
+ pointer_default(unique)
+ ]
+ interface IKsPropertySet : IUnknown
+ {
+ [local] HRESULT Set(
+ [in] REFGUID guidPropSet,
+ [in] DWORD dwPropID,
+ [in, size_is(cbInstanceData)] LPVOID pInstanceData,
+ [in] DWORD cbInstanceData,
+ [in, size_is(cbPropData)] LPVOID pPropData,
+ [in] DWORD cbPropData);
+
+ [call_as(Set)] HRESULT RemoteSet(
+ [in] REFGUID guidPropSet,
+ [in] DWORD dwPropID,
+ [in, size_is(cbInstanceData)] byte * pInstanceData,
+ [in] DWORD cbInstanceData,
+ [in, size_is(cbPropData)] byte * pPropData,
+ [in] DWORD cbPropData);
+
+ // To get a property, the caller allocates a buffer which the called
+ // function fills in. To determine necessary buffer size, call Get with
+ // pPropData=NULL and cbPropData=0.
+ [local] HRESULT Get(
+ [in] REFGUID guidPropSet,
+ [in] DWORD dwPropID,
+ [in, size_is(cbInstanceData)] LPVOID pInstanceData,
+ [in] DWORD cbInstanceData,
+ [out, size_is(cbPropData)] LPVOID pPropData,
+ [in] DWORD cbPropData,
+ [out] DWORD * pcbReturned);
+
+ [call_as(Get)] HRESULT RemoteGet(
+ [in] REFGUID guidPropSet,
+ [in] DWORD dwPropID,
+ [in, size_is(cbInstanceData)] byte * pInstanceData,
+ [in] DWORD cbInstanceData,
+ [out, size_is(cbPropData)] byte * pPropData,
+ [in] DWORD cbPropData,
+ [out] DWORD * pcbReturned);
+ // QuerySupported must either return E_NOTIMPL or correctly indicate
+ // if getting or setting the property set and property is supported.
+ // S_OK indicates the property set and property ID combination is
+ HRESULT QuerySupported(
+ [in] REFGUID guidPropSet,
+ [in] DWORD dwPropID,
+ [out] DWORD *pTypeSupport);
+ }
+cpp_quote("#endif // _IKsPropertySet_")
+
+[
+object,
+uuid(6025A880-C0D5-11d0-BD4E-00A0C911CE86),
+pointer_default(unique)
+]
+interface IMediaPropertyBag : IPropertyBag
+{
+ import "ocidl.idl";
+
+ typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG;
+
+ // return the i'th element in the property bag
+ HRESULT EnumProperty(
+ [in] ULONG iProperty,
+ [in, out] VARIANT * pvarPropertyName,
+ [in, out] VARIANT * pvarPropertyValue
+ );
+
+}
+
+
+[
+object,
+uuid(5738E040-B67F-11d0-BD4D-00A0C911CE86),
+pointer_default(unique)
+]
+interface IPersistMediaPropertyBag : IPersist
+{
+ import "ocidl.idl";
+ import "unknwn.idl";
+
+ HRESULT InitNew(
+ void
+ );
+
+ HRESULT Load(
+ [in] IMediaPropertyBag * pPropBag,
+ [in] IErrorLog * pErrorLog
+ );
+
+ HRESULT Save(
+ [in] IMediaPropertyBag * pPropBag,
+ [in] BOOL fClearDirty,
+ [in] BOOL fSaveAllProperties
+ );
+
+
+ typedef IPersistMediaPropertyBag * LPPERSISTMEDIAPROPERTYBAG;
+}
+
+
+ //---------------------------------------------------------------------
+ //
+ // Defines IAMPhysicalPinInfo Interface
+ //
+ // Returns an enum and string that describes an input pin's physical type.
+ //
+ // Implement if: you have physical input pins such as video or audio (like
+ // on a video capture card or a VCR)
+ //
+ // Use if: you want to communicate to a user available physical input pins
+ // and allow them to select the active one if there is more than one
+ //---------------------------------------------------------------------
+
+
+[
+ object,
+ uuid(F938C991-3029-11cf-8C44-00AA006B6814),
+ pointer_default(unique)
+ ]
+interface IAMPhysicalPinInfo : IUnknown {
+
+ // Returns VFW_E_NO_ACCEPTABLE_TYPES if not a physical pin
+ HRESULT GetPhysicalType(
+ [out] long *pType, // the enum representing the Physical Type
+ [out] LPOLESTR *ppszType // a friendly name
+ );
+}
+typedef IAMPhysicalPinInfo *PAMPHYSICALPININFO;
+
+ //---------------------------------------------------------------------
+ // Defines IAMExtDevice Interface
+ //
+ // Base interface for external professional devices
+ //
+ // Implement if: the filter controls an external device such as a VCR,
+ // timecode reader/generator, etc. The intent is to build a object from
+ // this implementation plus another that specifically describes the device,
+ // such as IAMExtTransport.
+ //
+ // Use if: you want to control and external device such as a VCR
+ //
+ // See edevdefs.h for the enumerated parameter list
+ //---------------------------------------------------------------------
+ [
+ object,
+ uuid(B5730A90-1A2C-11cf-8C23-00AA006B6814),
+ pointer_default(unique)
+ ]
+ interface IAMExtDevice : IUnknown
+ {
+ // General device capabilities property. See edevdefs.h for supported
+ // values
+ HRESULT GetCapability(
+ [in] long Capability, // identify the property
+ [out] long *pValue, // return value
+ [out] double *pdblValue // return value
+ );
+
+ // Get external device identification string. Usually the model #
+ // of the device
+ HRESULT get_ExternalDeviceID(
+ [out] LPOLESTR *ppszData // ID string
+ );
+
+ HRESULT get_ExternalDeviceVersion(
+ [out] LPOLESTR *ppszData // revision string
+ );
+
+ // Controls the external device's power mode
+ HRESULT put_DevicePower([in] long PowerMode
+ );
+ HRESULT get_DevicePower([out] long *pPowerMode
+ );
+
+ // Some devices need to be reset in some way, i.e., rewinding a VCR
+ // to the beginning of the tape and resetting the counter to zero.
+ HRESULT Calibrate(
+ [in] HEVENT hEvent,
+ [in] long Mode,
+ [out] long *pStatus // OATRUE is active, OAFALSE is inactive
+ );
+
+ // Selects the device's communications port, i.e.,COM1, IEEE1394, etc.
+ // See edevdefs.h for enums
+ HRESULT put_DevicePort([in] long DevicePort
+ );
+ HRESULT get_DevicePort([out] long *pDevicePort
+ );
+
+}
+typedef IAMExtDevice *PEXTDEVICE;
+
+ //---------------------------------------------------------------------
+ // Defines IAMExtTransport Interface
+ //
+ // Contains properties and methods that control behavior of an external
+ // transport device such as a VTR
+ //
+ // Implement if: you control such a device. Intended to be agregated
+ // with IAMExtDevice.
+ //
+ // Use if: you want to control such a device
+ //
+ // See edevdefs.h for the parameter lists
+ //---------------------------------------------------------------------
+[
+ object,
+ uuid(A03CD5F0-3045-11cf-8C44-00AA006B6814),
+ pointer_default(unique)
+ ]
+interface IAMExtTransport : IUnknown {
+
+ // General transport capabilities property. See edevdefs.h for enums
+ HRESULT GetCapability(
+ [in] long Capability, // identify the property
+ [out] long *pValue, // return value
+ [out] double *pdblValue // return value
+ );
+
+ // For disc-based devices: spinning, or not spinning.
+ // For tape-based device: threaded, unthreaded or ejected
+ HRESULT put_MediaState([in] long State
+ );
+ HRESULT get_MediaState([out] long *pState // see edevdefs.h
+ );
+
+ // Determines state of unit's front panel
+ HRESULT put_LocalControl([in] long State
+ );
+ HRESULT get_LocalControl([out] long *pState // OATRUE or OAFALSE
+ );
+
+ // Transport status such as Play, Stop, etc. More extensive
+ // than AM states.
+ HRESULT GetStatus(
+ [in] long StatusItem, // see edevdefs.h
+ [out] long *pValue
+ );
+
+ // Parameters such as recording speed, servo reference, ballistics, etc.
+ HRESULT GetTransportBasicParameters(
+ [in] long Param,
+ [out] long *pValue,
+ [out] LPOLESTR *ppszData
+ );
+
+ HRESULT SetTransportBasicParameters(
+ [in] long Param,
+ [in] long Value,
+ [in] LPCOLESTR pszData
+ );
+
+ // Parameters such as video output mode
+ HRESULT GetTransportVideoParameters(
+ [in] long Param,
+ [out] long *pValue
+ );
+
+ HRESULT SetTransportVideoParameters(
+ [in] long Param,
+ [in] long Value
+ );
+
+ // Parameters such as audio channel enable
+ HRESULT GetTransportAudioParameters(
+ [in] long Param,
+ [out] long *pValue
+ );
+
+ HRESULT SetTransportAudioParameters(
+ [in] long Param,
+ [in] long Value
+ );
+
+ // Mode is the movement of the transport, i.e., Play, Stop,
+ // Record, Edit, etc.
+ HRESULT put_Mode([in] long Mode
+ );
+ HRESULT get_Mode([out] long *pMode
+ );
+
+ // Rate is for variable speed control of the the device. This
+ // can be linked to IMediaControl::Rate() in the implementation
+ // if desired.
+ HRESULT put_Rate([in] double dblRate
+ );
+ HRESULT get_Rate([out] double *pdblRate
+ );
+
+ // This is a lengthy method, that is, it is in effect until canceled or complete and
+ // requires housekeeping by the filter. It puts transport in play mode and maintains
+ // fixed relationship between master time reference and transport position.
+ HRESULT GetChase(
+ [out] long *pEnabled, // OATRUE | OAFALSE
+ [out] long *pOffset, // offset in current time format
+ [out] HEVENT *phEvent // completion notification
+ );
+ HRESULT SetChase(
+ [in] long Enable, // OATRUE | OAFALSE
+ [in] long Offset, // offset in current time format
+ [in] HEVENT hEvent // completion notification
+ );
+
+ // Also a lengthy method: temporarily change transport speed (for synchronizing).
+ HRESULT GetBump(
+ [out] long *pSpeed,
+ [out] long *pDuration // in current time format
+ );
+ HRESULT SetBump(
+ [in] long Speed,
+ [in] long Duration // in current time format
+ );
+
+ // Enable/Disable transport anti-headclog control.
+ HRESULT get_AntiClogControl([out] long *pEnabled // OATRUE | OAFALSE
+ );
+ HRESULT put_AntiClogControl([in] long Enable // OATRUE | OAFALSE
+ );
+
+ // The following group of properties describes edit events. An edit event can be a
+ // standard insert or assemble edit or a memorized position called a bookmark.
+ // A NOTE ABOUT EVENTS: as with all lengthy commands, event objects must be created to
+ // signal completion or error.
+
+ // Intended usage: an edit event is prepared for use by:
+ // 1. Registering an edit property set and getting an EditID
+ // 2. Setting the necessary edit properties
+ // 3. Setting the edit property set active
+
+ // Please see edevdefs.h for properties and values
+
+ // The reference clock's advance is the mechanism that puts an edit in motion (see
+ // ED_EDIT_REC_INPOINT).
+
+ // Property set methods
+ HRESULT GetEditPropertySet(
+ [in] long EditID,
+ [out] long *pState // ED_SET_ACTIVE | ED_SET_INACTIVE | ED_SET_INVALID
+ // | ED_SET_EXECUTING
+ );
+
+ HRESULT SetEditPropertySet(
+ [in, out] long *pEditID,
+ [in] long State // ED_SET_REGISTER | ED_SET_DELETE | ED_SET_ACTIVE |
+ ); // ED_SET_INACTIVE
+
+ // the following properties define an edit event such as a bookmark, seek point, or
+ // actual edit
+ HRESULT GetEditProperty(
+ [in] long EditID,
+ [in] long Param,
+ [out] long *pValue
+ );
+ HRESULT SetEditProperty(
+ [in] long EditID,
+ [in] long Param,
+ [in] long Value
+ );
+
+ // Activates a capable transport's edit control (typically used for "on the fly" editing).
+ HRESULT get_EditStart([out] long *pValue // OATRUE or OAFALSE
+ );
+ HRESULT put_EditStart([in] long Value // OATRUE or OAFALSE
+ );
+}
+typedef IAMExtTransport *PIAMEXTTRANSPORT;
+
+ //---------------------------------------------------------------------
+ // Defines IAMTimecodeReader Interface
+ //
+ // Contains properties and methods that define behavior of a
+ // SMPTE/MIDI Timecode Reader. It is expected that this interface
+ // will be combined (aggregated) with IAMExtTransport to "build" a pro
+ // VCR.
+ //
+ // Implement if: you control such a device
+ //
+ // Use if: you want to control such a device
+ //
+ // See edevdefs.h for the parameter lists
+ //=====================================================================
+
+
+// timecode structures
+cpp_quote("#if 0")
+cpp_quote("/* the following is what MIDL knows how to remote */")
+typedef struct tagTIMECODE {
+ WORD wFrameRate; // will be replaced by AM defs, but see ED_FORMAT_SMPTE for now
+ WORD wFrameFract; // fractional frame. full scale is always 0x1000
+ DWORD dwFrames;
+}TIMECODE;
+cpp_quote("#else /* 0 */")
+cpp_quote("#ifndef TIMECODE_DEFINED")
+cpp_quote("#define TIMECODE_DEFINED")
+cpp_quote("typedef union _timecode {")
+cpp_quote(" struct {")
+cpp_quote(" WORD wFrameRate;")
+cpp_quote(" WORD wFrameFract;")
+cpp_quote(" DWORD dwFrames;")
+cpp_quote(" };")
+cpp_quote(" DWORDLONG qw;")
+cpp_quote(" } TIMECODE;")
+cpp_quote("")
+cpp_quote("#endif /* TIMECODE_DEFINED */")
+cpp_quote("#endif /* 0 */")
+
+typedef TIMECODE *PTIMECODE;
+
+typedef struct tagTIMECODE_SAMPLE {
+ LONGLONG qwTick; // ActiveMovie 100ns timestamp
+ TIMECODE timecode; // timecode
+ DWORD dwUser; // timecode user data (aka user bits)
+ DWORD dwFlags; // timecode flags - see below
+} TIMECODE_SAMPLE;
+typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE;
+
+
+[
+ object,
+ uuid(9B496CE1-811B-11cf-8C77-00AA006B6814),
+ pointer_default(unique)
+]
+interface IAMTimecodeReader : IUnknown
+{
+ // Timecode Reader Mode - gets/sets the following properties
+ // ED_TCR_SOURCE - timecode gen (readback), LTC, VITC, or Control Track
+ HRESULT GetTCRMode(
+ [in] long Param,
+ [out] long *pValue);
+ HRESULT SetTCRMode(
+ [in] long Param,
+ [in] long Value);
+
+ // Select which line of the vertical interval timecode will be read from (if VITC).
+ // To read VITC on specific multiple lines, the caller would make successive calls to
+ // put_VITCLine(), once for each line desired.
+ HRESULT put_VITCLine(
+ [in] long Line ); // valid lines are 11-20, 0 means autoselect,
+ // hi bit set means add to list of lines (for
+ // readers that test across multiple lines)
+ HRESULT get_VITCLine(
+ [out] long *pLine ); // hi bit set means multiple lines are used,
+ // and successive calls will cycle through the
+ // line numbers (like an enumerator, only simpler)
+
+ // GetTimecode can be used to obtain the most recent timecode value available in the
+ // stream. The client can use this to monitor the timecode, parse duplicates and
+ // discontinuities. The source filter supplying the timecode or possibly a down stream
+ // filter might want to parse for discontinuities or errors since you have to look at
+ // every sample to do this properly.
+ //
+
+ HRESULT GetTimecode(
+ [out] PTIMECODE_SAMPLE pTimecodeSample) ;
+
+}
+typedef IAMTimecodeReader *PIAMTIMECODEREADER;
+
+ //---------------------------------------------------------------------
+ //=====================================================================
+ // Defines IAMTimecodeGenerator Interface
+ //
+ // Contains properties and methods that define behavior of an external
+ // SMPTE/MIDI Timecode Generator. It is expected that this interface
+ // will be combined (aggregated) with IAMExtTransport to "build" a pro
+ // VCR.
+ //
+ // Implement if: you control such a device
+ //
+ // Use if: you want to control such a device
+ //
+ // See edevdefs.h for the parameter lists
+ //---------------------------------------------------------------------
+[
+ object,
+ uuid(9B496CE0-811B-11cf-8C77-00AA006B6814),
+ pointer_default(unique)
+ ]
+interface IAMTimecodeGenerator : IUnknown {
+
+ // Timecode Generator Mode - gets/sets the following properties (see
+ // vcrdefss.h for detailed values):
+ // ED_TCG_TIMECODE_TYPE - LTC, VITC, or MIDI
+ // ED_TCG_FRAMERATE - 24, 25, 30 drop or 30 nondrop
+ // ED_TCG_SYNC_SOURCE - what is driving the bitclock
+ // ED_TCG_REFERENCE_SOURCE - what is driving the count value
+ HRESULT GetTCGMode(
+ [in] long Param,
+ [out] long *pValue);
+
+ HRESULT SetTCGMode(
+ [in] long Param,
+ [in] long Value);
+
+ // Select into which line(s) of the vertical interval timecode will be inserted (if VITC).
+ // Hi bit set means add this line to any previously set lines.
+ // To generate VITC on specific multiple lines, the caller would make successive calls to
+ // put_VITCLine(), once for each line desired.
+ HRESULT put_VITCLine(
+ [in] long Line // valid lines are 11-20, 0 means autoselect(this setting
+ ); // is for TC readers that decode from multiple lines)
+ HRESULT get_VITCLine(
+ [out] long *pLine
+ );
+
+ // Sets timecode and/or userbit value. If generator is running, takes effect
+ // immediately. If caller wants to set only timecode, set userbit value to -1L (and
+ // same for setting userbits only)
+ //
+
+ HRESULT SetTimecode(
+ [in] PTIMECODE_SAMPLE pTimecodeSample) ;
+
+
+ // GetTimecode can be used to obtain the most recent timecode value available in the
+ // stream. The client can use this to monitor the timecode and verify the generator is
+ // working properly
+ //
+
+ HRESULT GetTimecode(
+ [out] PTIMECODE_SAMPLE pTimecodeSample) ;
+
+}
+typedef IAMTimecodeGenerator *PIAMTIMECODEGENERATOR;
+
+ //---------------------------------------------------------------------
+ // Defines IAMTimecodeDisplay Interface
+ //
+ // Contains properties and methods that define behavior of an external
+ // SMPTE/MIDI Timecode Display device (aka "character generator" for
+ // making "burn-ins" or "window dubs"). It is expected that this interface
+ // will be combined (aggregated) with IAMExtTransport and the timecode
+ // interfaces to "build" a pro VCR.
+ //
+ // Implement if: you control such a device
+ //
+ // Use if: you want to control such a device
+ //
+ // See edevdefs.h for the parameter lists
+ //---------------------------------------------------------------------
+[
+ object,
+ uuid(9B496CE2-811B-11cf-8C77-00AA006B6814),
+ pointer_default(unique)
+ ]
+interface IAMTimecodeDisplay : IUnknown
+{
+ // Enable/disable external device's timecode reader's character generator output. Some
+ // readers have this feature - this is not intended for rendering inside the PC!
+ HRESULT GetTCDisplayEnable(
+ [out] long *pState); // OATRUE | OAFALSE
+ HRESULT SetTCDisplayEnable(
+ [in] long State); // OATRUE | OAFALSE
+ // Timecode reader's character generator output
+ // characteristics (size, position, intensity, etc.).
+ HRESULT GetTCDisplay(
+ [in] long Param,
+ [out] long *pValue);
+ HRESULT SetTCDisplay(
+ [in] long Param,
+ [in] long Value);
+
+ /* Allowable params and values (see edevdefs.h for details):
+ ED_TCD_SOURCE
+ ED_TCR | ED_TCG
+ ED_TCD_SIZE
+ ED_SMALL | ED_MED | ED_LARGE
+ ED_TCD_POSITION
+ ED_TOP | ED_MIDDLE | ED_BOTTOM or'd with
+ ED_LEFT | ED_CENTER | ED_RIGHT
+ ED_TCD_INTENSITY
+ ED_HIGH | ED_LOW
+ ED_TCD_TRANSPARENCY // set from 0 to 4, 0 being completely opaque
+ ED_TCD_INVERT // white on black or black on white
+ OATRUE | OAFALSE
+ ED_TCD_BORDER // white border for black chars, black border for white letters
+ OATRUE | OAFALSE
+ */
+}
+typedef IAMTimecodeDisplay *PIAMTIMECODEDISPLAY;
+
+
+[
+ object,
+ uuid(c6545bf0-e76b-11d0-bd52-00a0c911ce86),
+ pointer_default(unique)
+]
+interface IAMDevMemoryAllocator : IUnknown
+{
+ HRESULT GetInfo(
+ [out] DWORD *pdwcbTotalFree,
+ [out] DWORD *pdwcbLargestFree,
+ [out] DWORD *pdwcbTotalMemory,
+ [out] DWORD *pdwcbMinimumChunk);
+
+ HRESULT CheckMemory(
+ [in] const BYTE *pBuffer);
+
+ HRESULT Alloc(
+ [out] BYTE **ppBuffer,
+ [in, out] DWORD *pdwcbBuffer);
+
+ HRESULT Free(
+ [in] BYTE *pBuffer);
+
+ HRESULT GetDevMemoryObject(
+ [out] IUnknown **ppUnkInnner,
+ [in] IUnknown *pUnkOuter);
+}
+typedef IAMDevMemoryAllocator *PAMDEVMEMORYALLOCATOR;
+
+
+[
+ object,
+ uuid(c6545bf1-e76b-11d0-bd52-00a0c911ce86),
+ pointer_default(unique)
+]
+interface IAMDevMemoryControl : IUnknown
+{
+ HRESULT QueryWriteSync();
+
+ HRESULT WriteSync();
+
+ HRESULT GetDevId(
+ [out] DWORD *pdwDevId);
+
+}
+typedef IAMDevMemoryControl *PAMDEVMEMORYCONTROL;
+
+// Flags for IAMStreamSelection::Info
+enum _AMSTREAMSELECTINFOFLAGS {
+ AMSTREAMSELECTINFO_ENABLED = 0x01, // Enable - off for disable
+ AMSTREAMSELECTINFO_EXCLUSIVE = 0x02 // Turns off the others in the group
+ // when enabling this one
+};
+// Flags for IAMStreamSelection::Enable
+enum _AMSTREAMSELECTENABLEFLAGS {
+ // Currently valid values are :
+ // 0 - disable all streams in the group containing this stream
+ // ..._ENABLE - enable only this stream with in the given group
+ // and disable all others
+ // ..._ENABLEALL - send out all streams
+ AMSTREAMSELECTENABLE_ENABLE = 0x01, // Enable
+ AMSTREAMSELECTENABLE_ENABLEALL = 0x02 // Enable all streams in the group
+ // containing this stream
+};
+
+// Control which logical streams are played and find out information about
+// them
+// Normally supported by a filter
+[
+ object,
+ uuid(c1960960-17f5-11d1-abe1-00a0c905f375),
+ pointer_default(unique)
+]
+interface IAMStreamSelect : IUnknown
+{
+ // Returns total count of streams
+ HRESULT Count(
+ [out] DWORD *pcStreams); // Count of logical streams
+
+ // Return info for a given stream - S_FALSE if iIndex out of range
+ // The first steam in each group is the default
+ HRESULT Info(
+ [in] long lIndex, // 0-based index
+ [out] AM_MEDIA_TYPE **ppmt, // Media type - optional
+ // Use DeleteMediaType to free
+ [out] DWORD *pdwFlags, // flags - optional
+ [out] LCID *plcid, // LCID (returns 0 if none) - optional
+ [out] DWORD *pdwGroup, // Logical group - optional
+ [out] WCHAR **ppszName, // Name - optional - free with CoTaskMemFree
+ // optional
+ [out] IUnknown **ppObject, // Associated object - optional
+ // Object may change if Enable is
+ // called on this interface
+ // - returns NULL if no associated object
+ // Returns pin or filter for DShow
+ [out] IUnknown **ppUnk); // Stream specific interface
+
+ // Enable or disable a given stream
+ HRESULT Enable(
+ [in] long lIndex,
+ [in] DWORD dwFlags);
+}
+typedef IAMStreamSelect *PAMSTREAMSELECT;
+
+enum _AMRESCTL_RESERVEFLAGS
+{
+ AMRESCTL_RESERVEFLAGS_RESERVE = 0x00, // Increment reserve count
+ AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x01 // Decrement reserve count
+};
+
+// Reserve resources now so that playback can be subsequently
+// guaranteed
+//
+// Normally supported by a filter
+//
+[
+ object,
+ uuid(8389d2d0-77d7-11d1-abe6-00a0c905f375),
+ pointer_default(unique),
+ local
+]
+interface IAMResourceControl : IUnknown
+{
+ // The reserve count is incremented/decremented if and only if
+ // S_OK is returned
+ // Unreserve once for every Reserve call
+ HRESULT Reserve(
+ [in] DWORD dwFlags, // From _AMRESCTL_RESERVEFLAGS enum
+ [in] PVOID pvReserved // Must be NULL
+ );
+}
+
+
+// Set clock adjustments - supported by some clocks
+[
+ object,
+ uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375),
+ pointer_default(unique),
+ local
+]
+interface IAMClockAdjust : IUnknown
+{
+ // Set the following delta to clock times
+ // The clock will add adjust its times by the given delta
+ HRESULT SetClockDelta(
+ [in] REFERENCE_TIME rtDelta
+ );
+};
+
+// Filter miscellaneous status flags
+
+enum _AM_FILTER_MISC_FLAGS {
+ AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x00000001, /* Will deliver EC_COMPLETE
+ at end of media */
+ AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x00000002 /* Filter sources data */
+};
+
+[
+ object,
+ uuid(2dd74950-a890-11d1-abe8-00a0c905f375),
+ pointer_default(unique),
+ local
+]
+interface IAMFilterMiscFlags : IUnknown
+{
+ // Get miscellaneous property flags
+ ULONG GetMiscFlags(void);
+};
+
+
+// Video Image drawing interface
+[
+ object,
+ local,
+ uuid(48efb120-ab49-11d2-aed2-00a0c995e8d5),
+ pointer_default(unique),
+]
+interface IDrawVideoImage : IUnknown
+{
+ HRESULT DrawVideoImageBegin();
+
+ HRESULT DrawVideoImageEnd();
+
+ HRESULT DrawVideoImageDraw(
+ [in] HDC hdc,
+ [in] LPRECT lprcSrc,
+ [in] LPRECT lprcDst
+ );
+}
+
+//
+// Video Image decimation interface
+//
+// The aim of this interface is to enable a video renderer filter to
+// control the decimation properties of a video decoder connected to
+// the video renderer
+//
+// This interface should only be supported by decoders that are capable of
+// decimating their output image by an arbitary amount.
+//
+//
+[
+ object,
+ local,
+ uuid(2e5ea3e0-e924-11d2-b6da-00a0c995e8df),
+ pointer_default(unique),
+]
+interface IDecimateVideoImage : IUnknown
+{
+ //
+ // Informs the decoder that it should decimate its output
+ // image to the specified width and height. If the decoder can
+ // decimate to this size it should return S_OK.
+ // If the decoder can't perform the requested decimation
+ // or wants to stop performing the decimation that it is
+ // currently doing it should return E_FAIL.
+ //
+ HRESULT SetDecimationImageSize(
+ [in] long lWidth,
+ [in] long lHeight);
+
+ //
+ // Informs the decoder that it should stop decimating its output image
+ // and resume normal output.
+ //
+ HRESULT ResetDecimationImageSize();
+}
+
+typedef enum _DECIMATION_USAGE {
+ DECIMATION_LEGACY, // decimate at ovly then video port then crop
+ DECIMATION_USE_DECODER_ONLY, // decimate image at the decoder only
+ DECIMATION_USE_VIDEOPORT_ONLY, // decimate at the video port only
+ DECIMATION_USE_OVERLAY_ONLY, // decimate at the overlay only
+ DECIMATION_DEFAULT // decimate at decoder then ovly the vide port then crop
+} DECIMATION_USAGE;
+
+[
+ object,
+ local,
+ uuid(60d32930-13da-11d3-9ec6-c4fcaef5c7be),
+ pointer_default(unique),
+]
+interface IAMVideoDecimationProperties: IUnknown
+{
+ //
+ // Queries the current usage of the above IDecimateVideoImage
+ // interface.
+ //
+ HRESULT QueryDecimationUsage(
+ [out] DECIMATION_USAGE* lpUsage); // from DECIMATION_USAGE enum
+
+ //
+ // Sets the current usage of the above IDecimateVideoImage
+ // interface.
+ //
+ HRESULT SetDecimationUsage(
+ [in] DECIMATION_USAGE Usage); // from DECIMATION_USAGE enum
+}
+
+//---------------------------------------------------------------------
+//
+// IVideoFrameStep interface
+//
+//---------------------------------------------------------------------
+
+[
+ object,
+ uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a),
+ pointer_default(unique),
+]
+interface IVideoFrameStep : IUnknown
+{
+ //
+ // Stop(), Pause(), Run() all cancel Step as does any seeking
+ // request.
+ //
+ // The Step() and CancelStep() methods of this interface
+ // Cancel any previous step.
+ //
+ // When stepping is complete EC_STEP_COMPLETE is signalled.
+ //
+ // When the filter graph gets EC_STEP_COMPLETE it automatically
+ // sets the filter graph into paused state and forwards the
+ // notification to the application
+ //
+ // Returns S_OK if stepping initiated.
+ //
+ // dwFrames
+ // 1 means step 1 frame forward
+ // 0 is invalid
+ // n (n > 1) means skip n - 1 frames and show the nth
+ //
+ // pStepObject
+ // NULL - default step object (filter) picked
+ // non-NULL - use this object for stepping
+ //
+ HRESULT Step(DWORD dwFrames, [unique] IUnknown *pStepObject);
+
+ // Can step?
+ // Returns S_OK if it can, S_FALSE if it can't or error code.
+ // bMultiple - if TRUE return whether can step n > 1
+ HRESULT CanStep(long bMultiple, [unique] IUnknown *pStepObject);
+
+ // Cancel stepping
+ HRESULT CancelStep();
+}
+
+
+
+
+//---------------------------------------------------------------------
+//
+// IAMPushSource interface
+//
+// Provides a means for source filters to describe information about the
+// data that they source, such as whether the data is live or not, and
+// what type of clock was used for timestamps. This information may be
+// needed by other clocks in the graph in order to provide accurate
+// synchronization. Also provides a way to specify an offset value for
+// the filter to use when timestamping the streams it sources. Provides
+// support for the IAMLatency interface as well.
+//
+//---------------------------------------------------------------------
+
+enum _AM_PUSHSOURCE_FLAGS {
+
+ //
+ // The default assumption is that the data is from a live source,
+ // time stamped with the graph clock, and the source does not
+ // attempt to rate match the data it delivers.
+ // The following flags can be used to override this assumption.
+ //
+
+ // capability flags
+ AM_PUSHSOURCECAPS_INTERNAL_RM = 0x00000001, // source provides internal support for rate matching
+ AM_PUSHSOURCECAPS_NOT_LIVE = 0x00000002, // don't treat source data as live
+ AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x00000004, // source data timestamped with clock not
+ // exposed to the graph
+
+ // request flags, set by user via SetPushSourceFlags method
+ AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x00010000, // source was requested to timestamp
+ // using a clock that isn't the graph clock
+
+ AM_PUSHSOURCEREQS_USE_CLOCK_CHAIN = 0x00020000, // source requests reference clock chaining
+};
+
+//
+// Used to set a source filter to run in a "live" mode.
+//
+[
+object,
+ uuid(F185FE76-E64E-11d2-B76E-00C04FB6BD3D),
+ pointer_default(unique)
+]
+interface IAMPushSource : IAMLatency
+{
+ // used to discover push source's capabilities.
+ // may be any combination of the AM_PUSHSOURCE_FLAGS flags.
+ HRESULT GetPushSourceFlags (
+ [out] ULONG *pFlags
+ );
+
+ // used to set request flags for a push source.
+ // may be a combination of the AM_PUSHSOURCE_REQS_xxx flags.
+ HRESULT SetPushSourceFlags (
+ [in] ULONG Flags
+ );
+
+ // specify an offset for push source time stamps
+ HRESULT SetStreamOffset (
+ [in] REFERENCE_TIME rtOffset
+ );
+
+ // retrieve the offset this push source is using
+ HRESULT GetStreamOffset (
+ [out] REFERENCE_TIME *prtOffset
+ );
+
+ // retrieve the maximum stream offset this push source thinks it can support
+ HRESULT GetMaxStreamOffset (
+ [out] REFERENCE_TIME *prtMaxOffset
+ );
+
+ // allows the filter graph to tell a push source the maximum latency allowed on the graph
+ // this allows pins like the video capture preview pin to be more efficient with the amount
+ // of buffering required to support the maximum graph latency
+ HRESULT SetMaxStreamOffset (
+ [in] REFERENCE_TIME rtMaxOffset
+ );
+};
+
+
+// ------------------------------------------------------------------------
+//
+// IAMDeviceRemoval interface
+//
+// Implemented by filters to request and receive WM_DEVICECHANGE
+// notifications
+//
+// ------------------------------------------------------------------------
+
+[
+ object,
+ uuid(f90a6130-b658-11d2-ae49-0000f8754b99),
+ pointer_default(unique)
+]
+interface IAMDeviceRemoval : IUnknown
+{
+
+ HRESULT DeviceInfo(
+ [out] CLSID *pclsidInterfaceClass,
+ [out] WCHAR **pwszSymbolicLink);
+
+ HRESULT Reassociate();
+
+ HRESULT Disassociate();
+}
+
+//
+// for DV
+//
+typedef struct {
+ //for 1st 5/6 DIF seq.
+ DWORD dwDVAAuxSrc;
+ DWORD dwDVAAuxCtl;
+ //for 2nd 5/6 DIF seq.
+ DWORD dwDVAAuxSrc1;
+ DWORD dwDVAAuxCtl1;
+ //for video information
+ DWORD dwDVVAuxSrc;
+ DWORD dwDVVAuxCtl;
+ DWORD dwDVReserved[2];
+
+} DVINFO, *PDVINFO;
+
+// ------------------------------------------------------------------------
+//
+// IDVEnc interface
+//
+// Implemented by DV encoder filters to set Encoder format
+//
+// ------------------------------------------------------------------------
+enum _DVENCODERRESOLUTION { //resolution
+ DVENCODERRESOLUTION_720x480 = 2012,
+ DVENCODERRESOLUTION_360x240 = 2013,
+ DVENCODERRESOLUTION_180x120 = 2014,
+ DVENCODERRESOLUTION_88x60 = 2015
+};
+enum _DVENCODERVIDEOFORMAT { //PAL/ntsc
+ DVENCODERVIDEOFORMAT_NTSC = 2000,
+ DVENCODERVIDEOFORMAT_PAL = 2001
+};
+enum _DVENCODERFORMAT { // dvsd/dvhd/dvsl
+ DVENCODERFORMAT_DVSD = 2007,
+ DVENCODERFORMAT_DVHD = 2008,
+ DVENCODERFORMAT_DVSL = 2009
+};
+[
+ object,
+ uuid(d18e17a0-aacb-11d0-afb0-00aa00b67a42),
+ pointer_default(unique)
+]
+interface IDVEnc : IUnknown
+{
+
+ HRESULT get_IFormatResolution (
+ [out] int *VideoFormat, //pal or ntsc
+ [out] int *DVFormat, //dvsd dvhd dvsl
+ [out] int *Resolution, //720, 360, 180,88
+ [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO
+ [out] DVINFO *sDVInfo //NULL if fDVInfo=FALSE,
+ );
+
+ HRESULT put_IFormatResolution (
+ [in] int VideoFormat,
+ [in] int DVFormat,
+ [in] int Resolution,
+ [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO
+ [in] DVINFO *sDVInfo //NULL if fDVInfo=FALSE,
+ );
+
+}
+
+// ------------------------------------------------------------------------
+//
+// IDVDec interface
+//
+// Implemented by DV decoder filters to set decoder size
+//
+// ------------------------------------------------------------------------
+enum _DVDECODERRESOLUTION {
+ DVDECODERRESOLUTION_720x480 = 1000,
+ DVDECODERRESOLUTION_360x240 = 1001,
+ DVDECODERRESOLUTION_180x120 = 1002,
+ DVDECODERRESOLUTION_88x60 = 1003
+};
+enum _DVRESOLUTION {
+ DVRESOLUTION_FULL = 1000,
+ DVRESOLUTION_HALF = 1001,
+ DVRESOLUTION_QUARTER = 1002,
+ DVRESOLUTION_DC = 1003
+};
+[
+ object,
+ uuid(b8e8bd60-0bfe-11d0-af91-00aa00b67a42),
+ pointer_default(unique)
+]
+interface IIPDVDec : IUnknown
+{
+ HRESULT get_IPDisplay (
+ [out] int *displayPix // The display pixels arrage
+ );
+
+ HRESULT put_IPDisplay (
+ [in] int displayPix // Change to this display pixel arrage
+ ) ;
+}
+
+//------------------------------------------------------------------------
+//
+// IDVRGB219 interface
+//
+// Implemented by both the DV encoder and decoder filters
+// Used for enabling the 219 mode in which the Range of RGB24 either received
+// by the encoder or produced by the decoder becomes (16,16,16)--(235,235,235)
+// instead of (0,0,0)--(255,255,255).
+// The interface's method has no effect in case of any other color space than
+// RGB 24
+//
+//------------------------------------------------------------------------
+
+[
+ object,
+ uuid(58473A19-2BC8-4663-8012-25F81BABDDD1),
+ pointer_default(unique)
+]
+interface IDVRGB219 : IUnknown
+{
+ HRESULT SetRGB219 ([in] BOOL bState); // State = True Turn 219 mode on else turn it off.
+}
+
+
+// ------------------------------------------------------------------------
+//
+// IDVSplitter interface
+//
+// Implemented by DV splitter filters
+//
+// ------------------------------------------------------------------------
+[
+ object,
+ uuid(92a3a302-da7c-4a1f-ba7e-1802bb5d2d02)
+]
+interface IDVSplitter : IUnknown
+{
+ HRESULT DiscardAlternateVideoFrames(
+ [in] int nDiscard
+ ) ;
+}
+
+// Audio Renderer statistics params for IAMAudioRendererStats interface
+enum _AM_AUDIO_RENDERER_STAT_PARAM {
+ AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1, // audio breaks
+ AM_AUDREND_STAT_PARAM_SLAVE_MODE, // current slave mode, see AM_AUDREND_SLAVE_MODEs
+ AM_AUDREND_STAT_PARAM_SILENCE_DUR, // silence inserted due to gaps (ms)
+ AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR, // duration of the last buffer received
+ AM_AUDREND_STAT_PARAM_DISCONTINUITIES, // discontinuities seen since running
+ AM_AUDREND_STAT_PARAM_SLAVE_RATE, // what rate are we currently slaving at? S_FALSE if not slaving
+ AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR, // for waveOut slaving - data dropped or added to stay in-sync
+ // dwParam1 - dropped duration(ms)
+ // dwParam2 - paused duration(ms)
+ AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR, // highest & lowest clock differences seen
+ // dwParam1 - high err
+ // dwParam2 - low err
+ AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR, // last high and low errs seen
+ // dwParam1 - last high err
+ // dwParam2 - last low err
+ AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, // error between master/slave clocks
+ AM_AUDREND_STAT_PARAM_BUFFERFULLNESS, // percent audio buffer fullness
+ AM_AUDREND_STAT_PARAM_JITTER // input buffer jitter
+};
+
+//---------------------------------------------------------------------
+//
+// IAMAudioRendererStats interface
+//
+// Interface to get at statistical information that is optionally stored
+// in an audio renderer filter. Supported on the filter interface (although
+// this might be better for ksproxy if we define it as a pin interface?)
+//
+//---------------------------------------------------------------------
+
+[
+object,
+ uuid(22320CB2-D41A-11d2-BF7C-D7CB9DF0BF93),
+ pointer_default(unique)
+]
+interface IAMAudioRendererStats : IUnknown
+{
+ // Get value corresponding to the passed in parameter id
+ HRESULT GetStatParam(
+ [in] DWORD dwParam,
+ [out] DWORD *pdwParam1,
+ [out] DWORD *pdwParam2
+ );
+}
+
+//---------------------------------------------------------------------
+//
+// IAMLatency interface
+//
+// Allows a filter to report the expected latency associated with a data
+// stream flowing from its input to output pin. Supported on output pins.
+//
+//---------------------------------------------------------------------
+
+[
+object,
+ uuid(62EA93BA-EC62-11d2-B770-00C04FB6BD3D),
+ pointer_default(unique)
+]
+interface IAMLatency : IUnknown
+{
+ HRESULT GetLatency(
+ [in] REFERENCE_TIME *prtLatency
+ );
+}
+
+
+enum _AM_INTF_SEARCH_FLAGS {
+ AM_INTF_SEARCH_INPUT_PIN = 0x00000001, // search input pins
+ AM_INTF_SEARCH_OUTPUT_PIN = 0x00000002, // search output pins
+ AM_INTF_SEARCH_FILTER = 0x00000004 // search filters
+};
+
+//---------------------------------------------------------------------
+//
+// IAMGraphStreams interface
+//
+// Interface used to control or search over connected streams of data
+// flow within a filter graph.
+//
+//---------------------------------------------------------------------
+
+[
+object,
+ uuid(632105FA-072E-11d3-8AF9-00C04FB6BD3D),
+ pointer_default(unique)
+]
+interface IAMGraphStreams : IUnknown
+{
+ // Search upstream from the current pin, for the specified interface.
+ // dwFlags can be any combination of the AM_INTF_SEARCH_FLAGS, and allows
+ // control over what objects to search. A value of 0 means to search all.
+ HRESULT FindUpstreamInterface(
+ [in] IPin *pPin,
+ [in] REFIID riid,
+ [out, iid_is(riid)] void **ppvInterface,
+ [in] DWORD dwFlags );
+
+ // Enable or disable the graph's setting of a timestamp offset
+ // on push sources.
+ HRESULT SyncUsingStreamOffset( [in] BOOL bUseStreamOffset );
+
+ // allow an app to set the maximum offset used on push source filters
+ HRESULT SetMaxGraphLatency( [in] REFERENCE_TIME rtMaxGraphLatency );
+}
+
+
+//
+// IAMOverlayFX
+//
+// This interface is exposed by the overlay mixer filter and allows
+// an application to apply various "effects" to the overlay surface
+// used by the overlay mixer.
+//
+// The effects that can be applied are described by the AMOVERLAYFX
+// enumeration.
+//
+enum AMOVERLAYFX {
+ // Normal (ie. top down, left to right) video
+ AMOVERFX_NOFX = 0x00000000,
+
+ // Mirror the overlay across the vertical axis
+ AMOVERFX_MIRRORLEFTRIGHT = 0x00000002,
+
+ // Mirror the overlay across the horizontal axis
+ AMOVERFX_MIRRORUPDOWN = 0x00000004,
+
+ // Deinterlace the overlay, if possible
+ AMOVERFX_DEINTERLACE = 0x00000008
+};
+
+[
+object,
+ uuid(62fae250-7e65-4460-bfc9-6398b322073c),
+ pointer_default(unique)
+]
+interface IAMOverlayFX : IUnknown
+{
+ // Use this method to determine what overlay effects are currently available
+ // for the overlay surface used by the overlay mixer filter.
+ //
+ HRESULT QueryOverlayFXCaps(
+ [out] DWORD *lpdwOverlayFXCaps
+ );
+
+ // Use this method to apply a new overlay effect to the overlay surface
+ // used by the overlay mixer filter. This method can be called while the
+ // filter graph is running, the effect is applied immediately
+ //
+ HRESULT SetOverlayFX(
+ [in] DWORD dwOverlayFX
+ );
+
+ // Use this method to determine what effect (if any) is currently being
+ // applied to the overlay surface by the overlay mixer filter.
+ //
+ HRESULT GetOverlayFX(
+ [out] DWORD *lpdwOverlayFX
+ );
+}
+
+
+
+// IAMOpenProgress interface provides information about current progress through
+// a download
+
+[
+object,
+uuid(8E1C39A1-DE53-11cf-AA63-0080C744528D),
+pointer_default(unique)
+]
+
+interface IAMOpenProgress : IUnknown
+{
+ // QueryProgress can be used to query the source filter which supports this interface
+ // for progress information during a renderfile operation.
+ HRESULT QueryProgress(
+ [out] LONGLONG* pllTotal,
+ [out] LONGLONG* pllCurrent
+ );
+
+ // AbortOperation can be used to request an abort of RenderFile operation
+ // causing it to stop downloading. This methods instructs the exporter of
+ // the IAMOpenProgress interface to hold up their internal abort flag until
+ // further notice.
+ HRESULT AbortOperation(
+ );
+}
+
+
+/*++
+ IMpeg2Demultiplexer
+
+ This interface is implemented by the MPEG-2 Demultiplexer filter,
+ irrespective of program vs. transport stream splitting functionality.
+--*/
+[
+ object,
+ local,
+ uuid (436eee9c-264f-4242-90e1-4e330c107512),
+ pointer_default(unique)
+]
+interface IMpeg2Demultiplexer : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ purpose: Creates an output pin of the specified media type.
+
+ pMediaType media type specifier for the new pin
+ pszPinName pin name; cannot be a duplicate of an existing pin
+ ppIPin IPin interface pointer to the newly created pin
+ --*/
+ HRESULT
+ CreateOutputPin (
+ [in] AM_MEDIA_TYPE * pMediaType,
+ [in] LPWSTR pszPinName,
+ [out] IPin ** ppIPin
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ purpose: Updates the media type of the specified output pin. If no
+ connection exists, the media type is updated always. If
+ the pin is connected, the success/failure of the call will
+ depend on downstream input pin's accetance/rejection of
+ the specified media type, and subsequent success/failure
+ of a reconnect.
+
+ pszPinName pin name
+ pMediaType new media type specifier
+ --*/
+ HRESULT
+ SetOutputPinMediaType (
+ [in] LPWSTR pszPinName,
+ [in] AM_MEDIA_TYPE * pMediaType
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ purpose: Deletes the specified output pin.
+
+ pszPinName pin name
+ --*/
+ HRESULT
+ DeleteOutputPin (
+ [in] LPWSTR pszPinName
+ ) ;
+} ;
+
+//---------------------------------------------------------------------
+// IEnumStreamIdMap interface
+//---------------------------------------------------------------------
+
+cpp_quote("#define MPEG2_PROGRAM_STREAM_MAP 0x00000000")
+cpp_quote("#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001")
+cpp_quote("#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002")
+cpp_quote("#define MPEG2_PROGRAM_PACK_HEADER 0x00000003")
+cpp_quote("#define MPEG2_PROGRAM_PES_STREAM 0x00000004")
+cpp_quote("#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005")
+
+cpp_quote("#define SUBSTREAM_FILTER_VAL_NONE 0x10000000")
+
+typedef struct {
+ ULONG stream_id ; // mpeg-2 stream_id
+ DWORD dwMediaSampleContent ; // #define'd above
+ ULONG ulSubstreamFilterValue ; // filtering value
+ int iDataOffset ; // offset to elementary stream
+} STREAM_ID_MAP ;
+
+/*++
+ Enumerates the StreamIds mapped on a pin
+--*/
+[
+ object,
+ local,
+ uuid (945C1566-6202-46fc-96C7-D87F289C6534),
+ pointer_default(unique)
+]
+interface IEnumStreamIdMap : IUnknown
+{
+ HRESULT
+ Next (
+ [in] ULONG cRequest,
+ [in, out, size_is (cRequest)] STREAM_ID_MAP * pStreamIdMap,
+ [out] ULONG * pcReceived
+ ) ;
+
+ HRESULT
+ Skip (
+ [in] ULONG cRecords
+ ) ;
+
+ HRESULT
+ Reset (
+ ) ;
+
+ HRESULT
+ Clone (
+ [out] IEnumStreamIdMap ** ppIEnumStreamIdMap
+ ) ;
+} ;
+
+/*++
+ Implemented on the output pin.
+
+ Provides the ability to map/unmap a stream_id to/from an output pin.
+--*/
+[
+ object,
+ local,
+ uuid (D0E04C47-25B8-4369-925A-362A01D95444),
+ pointer_default(unique)
+]
+interface IMPEG2StreamIdMap : IUnknown
+{
+ HRESULT
+ MapStreamId (
+ [in] ULONG ulStreamId, // mpeg-2 stream_id
+ [in] DWORD MediaSampleContent, // #define'd above IEnumStreamIdMap
+ [in] ULONG ulSubstreamFilterValue, // filter value
+ [in] int iDataOffset // elementary stream offset
+ ) ;
+
+ HRESULT
+ UnmapStreamId (
+ [in] ULONG culStreamId, // number of stream_id's in pulStreamId
+ [in] ULONG * pulStreamId // array of stream_id's to unmap
+ ) ;
+
+ HRESULT
+ EnumStreamIdMap (
+ [out] IEnumStreamIdMap ** ppIEnumStreamIdMap
+ ) ;
+} ;
+
+
+// Register a service provider with the filter graph
+[
+ object,
+ local,
+ uuid(7B3A2F01-0751-48DD-B556-004785171C54),
+ pointer_default(unique)
+]
+interface IRegisterServiceProvider : IUnknown
+{
+ // registers one service into it's internal table.. Object is refcounted.
+ // register a NULL value to remove the service
+ HRESULT RegisterService([in] REFGUID guidService, [in] IUnknown *pUnkObject);
+};
+
+
+
+//---------------------------------------------------------------------
+//
+// IAMClockSlave interface
+//
+// When the audio renderer is slaving to a separate graph clock this
+// interface provides a way for an app to specify how closely in sync
+// the slaving renderer should try to stay to the graph clock. Note that
+// using a larger tolerance for a video & audio playback graph will likely
+// result in looser a/v sync, so it recommended not to change this setting
+// except under special circumstances.
+//
+//---------------------------------------------------------------------
+
+//
+// Used to set/get the error tolerance used by a slaving audio renderer
+//
+[
+object,
+ uuid(9FD52741-176D-4b36-8F51-CA8F933223BE),
+ pointer_default(unique)
+]
+interface IAMClockSlave : IUnknown
+{
+ // set millisecond value to use for slaving tolerance
+ // the allowed range is 1 to 1000ms
+ HRESULT SetErrorTolerance (
+ [in] DWORD dwTolerance
+ );
+
+ // get millisecond value currently being used for slaving tolerance
+ HRESULT GetErrorTolerance (
+ [out] DWORD *pdwTolerance
+ );
+};
+
+
+
+//---------------------------------------------------------------------
+//
+// IAMGraphBuilderCallback interface
+//
+// Interface which gives the app a chance to configure filters
+// before a connection is attempted.
+//
+// If this interface is supported by the site passed in to the graph
+// via IObjectWithSite::SetSite, the graph will call back with each
+// filter it creates as part of the Render or Connect process. Does
+// not call back for source filters. Filter may be discarded and not
+// used in graph or may be connected and disconnected more than once
+//
+// The callback occurs with the graph lock held, so do not call into
+// the graph again and do not wait on other threads calling into the
+// graph.
+//
+//---------------------------------------------------------------------
+
+[
+ object,
+ uuid(4995f511-9ddb-4f12-bd3b-f04611807b79),
+ local,
+ pointer_default(unique)
+]
+interface IAMGraphBuilderCallback : IUnknown
+{
+ // graph builder selected a filter to create and attempt to
+ // connect. failure indicates filter should be rejected.
+ HRESULT SelectedFilter(
+ [in] IMoniker *pMon
+ );
+
+ // app configures filter during this call. failure indicates
+ // filter should be rejected.
+ HRESULT CreatedFilter(
+ [in] IBaseFilter *pFil
+ );
+};
+
+cpp_quote("#ifdef __cplusplus")
+cpp_quote("#ifndef _IAMFilterGraphCallback_")
+cpp_quote("#define _IAMFilterGraphCallback_")
+cpp_quote("// Note: Because this interface was not defined as a proper interface it is")
+cpp_quote("// supported under C++ only. Methods aren't stdcall.")
+cpp_quote("EXTERN_GUID(IID_IAMFilterGraphCallback,0x56a868fd,0x0ad4,0x11ce,0xb0,0xa3,0x0,0x20,0xaf,0x0b,0xa7,0x70);")
+cpp_quote("interface IAMFilterGraphCallback : public IUnknown")
+cpp_quote("{")
+cpp_quote(" // S_OK means rendering complete, S_FALSE means retry now.")
+cpp_quote(" virtual HRESULT UnableToRender(IPin *pPin) = 0;")
+cpp_quote(" ")
+cpp_quote("};")
+cpp_quote("#endif // _IAMFilterGraphCallback_")
+cpp_quote("#endif")
+
+//------------------------------------------------------------------------------
+// File: EncAPI.idl
+//
+// Desc: Encoder (and future decoder) interface definitions.
+//
+// Copyright (c) 1992 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+struct CodecAPIEventData
+{
+ GUID guid;
+ DWORD dataLength;
+ DWORD reserved[3];
+ // BYTE data[dataLength];
+};
+
+interface IStream; // forward declaration
+//
+// Applications can pass the CODECAPI_VIDEO_ENCODER to IsSupported to test for video encoders
+// Similarly, the GUIDs for audio encoders, video decoders, audio decoders and muxes can be
+// used to test for the codec classification
+//
+// See uuids.h for a more detailed list.
+//
+[
+ object,
+ uuid(901db4c7-31ce-41a2-85dc-8fa0bf41b8da),
+ pointer_default(unique)
+]
+interface ICodecAPI : IUnknown
+{
+ //
+ // IsSupported():
+ //
+ // Query whether a given parameter is supported.
+ //
+ HRESULT
+ IsSupported (
+ [in] const GUID *Api
+ );
+
+ //
+ // IsModifiable
+ //
+ // Query whether a given parameter can be changed given the codec selection
+ // and other parameter selections.
+ //
+ HRESULT
+ IsModifiable (
+ [in] const GUID *Api
+ );
+
+ //
+ // GetParameterRange():
+ //
+ // Returns the valid range of values that the parameter supports should
+ // the parameter support a stepped range as opposed to a list of specific
+ // values. The support is [ValueMin .. ValueMax] by SteppingDelta.
+ //
+ // Ranged variant types must fall into one of the below types. Each
+ // parameter will, by definition, return a specific type.
+ //
+ // If the range has no stepping delta (any delta will do), the Stepping
+ // delta will be empty (VT_EMPTY).
+ //
+ HRESULT
+ GetParameterRange (
+ [in] const GUID *Api,
+ [out] VARIANT *ValueMin,
+ [out] VARIANT *ValueMax,
+ [out] VARIANT *SteppingDelta
+ );
+
+ //
+ // GetParameterValues():
+ //
+ // Returns the list of values supported by the given parameter as a
+ // COM allocated array. The total number of values will be placed in
+ // the ValuesCount parameter and the Values array will contain the
+ // individual values. This array must be freed by the caller through
+ // CoTaskMemFree().
+ //
+ HRESULT
+ GetParameterValues (
+ [in] const GUID *Api,
+ [out, size_is(,*ValuesCount)] VARIANT **Values,
+ [out] ULONG *ValuesCount
+ );
+
+ //
+ // GetDefaultValue():
+ //
+ // Get the default value for a parameter, if one exists. Otherwise,
+ // an error will be returned.
+ //
+ HRESULT
+ GetDefaultValue (
+ [in] const GUID *Api,
+ [out] VARIANT *Value
+ );
+
+ //
+ // GetValue():
+ //
+ // Get the current value of a parameter.
+ //
+ HRESULT
+ GetValue (
+ [in] const GUID *Api,
+ [out] VARIANT *Value
+ );
+
+ //
+ // SetValue():
+ //
+ // Set the current value of a parameter.
+ //
+ HRESULT
+ SetValue (
+ [in] const GUID *Api,
+ [in] VARIANT *Value
+ );
+
+ // new methods beyond IEncoderAPI
+
+ //
+ // RegisterForEvent():
+ //
+ // Enable events to be reported for the given event GUID. For DShow
+ // events, the event is returned as
+ // (EC_CODECAPI_EVENT, lParam=userData, lParam2=CodecAPIEventData* Data)
+ // where
+ // - the CodecAPIEventData is COM allocated memory and must be handled and freed
+ // by the application using CoTaskMemFree().
+ // - the userData is the same pointer passed to RegisterForEvent
+ //
+ // Each data block starts with the following structure:
+ // struct CodecAPIEventData
+ // {
+ // GUID guid;
+ // DWORD dataLength;
+ // DWORD reserved[3]; // pad to 16 byte alignment
+ // BYTE data[dataLength];
+ // }
+ // The guid parameter identifies the event. The data associated with the event follows the
+ // structure (represented by the variable length BYTE data[dataLength] array).
+ //
+ // If guid is equal to CODECAPI_CHANGELISTS, then data is an array of GUIDs that changed as
+ // a result of setting the parameter, as follows:
+ // GUID changedGuids[ header.dataLength / sizeof(GUID) ]
+ //
+ // The current array is limited, so a driver may send multiple messages if the array size is
+ // exceeded.
+ //
+ HRESULT
+ RegisterForEvent (
+ [in] const GUID *Api,
+ [in] LONG_PTR userData
+ );
+
+ //
+ // UnregisterForEvent():
+ //
+ // Disable event reporting for the given event GUID.
+ //
+ HRESULT
+ UnregisterForEvent (
+ [in] const GUID *Api
+ );
+
+ //
+ // SetAllDefaults
+ //
+ HRESULT SetAllDefaults(void);
+
+ //
+ // Extended SetValue & SetAllDefaults:
+ //
+ // Changes the current value of a parameter and returns back an alteration list
+ //
+ // The secondary arguments return back a list of other settings
+ // that changed as a result of the SetValue() call (for UI updates etc)
+ // The client must free the buffer.
+ //
+ HRESULT
+ SetValueWithNotify (
+ [in] const GUID *Api,
+ [in] VARIANT *Value,
+ [out, size_is(,*ChangedParamCount)] GUID **ChangedParam,
+ [out] ULONG *ChangedParamCount
+ );
+
+ //
+ // SetAllDefaultsWithNotify
+ //
+ HRESULT SetAllDefaultsWithNotify(
+ [out, size_is(,*ChangedParamCount)] GUID **ChangedParam,
+ [out] ULONG *ChangedParamCount
+ );
+ //
+ // GetAllSettings
+ // Load the current settings from a stream
+ //
+ HRESULT GetAllSettings( [in] IStream* );
+
+ //
+ // SetAllSettings
+ // Save the current settings to a stream
+ //
+ HRESULT SetAllSettings( [in] IStream* );
+
+ //
+ // SetAllSettingsWithNotify
+ //
+ HRESULT SetAllSettingsWithNotify( IStream*,
+ [out, size_is(,*ChangedParamCount)] GUID **ChangedParam,
+ [out] ULONG *ChangedParamCount );
+}
+
+[
+ object,
+ local,
+ uuid(a8809222-07bb-48ea-951c-33158100625b),
+ pointer_default(unique)
+]
+interface IGetCapabilitiesKey : IUnknown
+{
+ HRESULT GetCapabilitiesKey( [out] HKEY* pHKey );
+};
+
+// -----------------------------------------------------------------------------------------
+// From this point on, this is retained for backwards compatiblity only
+// Do not use this for future encoders
+// -----------------------------------------------------------------------------------------
+[
+ object,
+ uuid(70423839-6ACC-4b23-B079-21DBF08156A5),
+ pointer_default(unique)
+]
+interface IEncoderAPI : IUnknown
+{
+ HRESULT IsSupported ( [in] const GUID *Api );
+ HRESULT IsAvailable ( [in] const GUID *Api );
+ HRESULT GetParameterRange ( [in] const GUID *Api,
+ [out] VARIANT *ValueMin, [out] VARIANT *ValueMax,
+ [out] VARIANT *SteppingDelta );
+ HRESULT GetParameterValues ( [in] const GUID *Api,
+ [out, size_is(,*ValuesCount)] VARIANT **Values,
+ [out] ULONG *ValuesCount );
+ HRESULT GetDefaultValue ( [in] const GUID *Api, [out] VARIANT *Value );
+ HRESULT GetValue ( [in] const GUID *Api, [out] VARIANT *Value );
+ HRESULT SetValue ( [in] const GUID *Api, [in] VARIANT *Value );
+}
+
+[
+ object,
+ uuid(02997C3B-8E1B-460e-9270-545E0DE9563E),
+ pointer_default(unique)
+]
+interface IVideoEncoder : IEncoderAPI
+{
+}
+//---------------------------------------------------------------------
+//
+// Old Encoder API Interfaces
+//
+//---------------------------------------------------------------------
+
+cpp_quote ("#ifndef __ENCODER_API_DEFINES__")
+cpp_quote ("#define __ENCODER_API_DEFINES__")
+
+typedef enum {
+
+ //
+ // Bit rate used for encoding is constant
+ //
+ ConstantBitRate = 0,
+
+ //
+ // Bit rate used for encoding is variable with the specified bitrate used
+ // as a guaranteed average over a specified window. The default window
+ // size is considered to be 5 minutes.
+ //
+ VariableBitRateAverage,
+
+ //
+ // Bit rate used for encoding is variable with the specified bitrate used
+ // as a peak rate over a specified window. The default window size
+ // is considered to be 500ms (classically one GOP).
+ //
+ VariableBitRatePeak
+
+} VIDEOENCODER_BITRATE_MODE;
+
+cpp_quote ("#endif // __ENCODER_API_DEFINES__")
+
+cpp_quote("#define AM_GETDECODERCAP_QUERY_VMR_SUPPORT 0x00000001")
+cpp_quote("#define VMR_NOTSUPPORTED 0x00000000")
+cpp_quote("#define VMR_SUPPORTED 0x00000001")
+
+cpp_quote("#define AM_QUERY_DECODER_VMR_SUPPORT 0x00000001")
+cpp_quote("#define AM_QUERY_DECODER_DXVA_1_SUPPORT 0x00000002")
+
+cpp_quote("#define AM_QUERY_DECODER_DVD_SUPPORT 0x00000003")
+cpp_quote("#define AM_QUERY_DECODER_ATSC_SD_SUPPORT 0x00000004")
+cpp_quote("#define AM_QUERY_DECODER_ATSC_HD_SUPPORT 0x00000005")
+cpp_quote("#define AM_GETDECODERCAP_QUERY_VMR9_SUPPORT 0x00000006")
+
+cpp_quote("#define DECODER_CAP_NOTSUPPORTED 0x00000000")
+cpp_quote("#define DECODER_CAP_SUPPORTED 0x00000001")
+
+[
+ object,
+ local,
+ uuid(c0dff467-d499-4986-972b-e1d9090fa941),
+ pointer_default(unique)
+]
+interface IAMDecoderCaps : IUnknown
+{
+ HRESULT GetDecoderCaps([in] DWORD dwCapIndex, [out] DWORD* lpdwCap);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// IAMCertifiedOutputProtection
+//
+///////////////////////////////////////////////////////////////////////////////
+typedef struct _AMCOPPSignature {
+ BYTE Signature[256];
+} AMCOPPSignature;
+
+typedef struct _AMCOPPCommand {
+ GUID macKDI; // 16 bytes
+ GUID guidCommandID; // 16 bytes
+ DWORD dwSequence; // 4 bytes
+ DWORD cbSizeData; // 4 bytes
+ BYTE CommandData[4056]; // 4056 bytes (4056+4+4+16+16 = 4096)
+} AMCOPPCommand, *LPAMCOPPCommand;
+
+typedef struct _AMCOPPStatusInput {
+ GUID rApp; // 16 bytes
+ GUID guidStatusRequestID;// 16 bytes
+ DWORD dwSequence; // 4 bytes
+ DWORD cbSizeData; // 4 bytes
+ BYTE StatusData[4056]; // 4056 bytes (4056+4+4+16+16 = 4096)
+} AMCOPPStatusInput, *LPAMCOPPStatusInput;
+
+typedef struct _AMCOPPStatusOutput {
+ GUID macKDI; // 16 bytes
+ DWORD cbSizeData; // 4 bytes
+ BYTE COPPStatus[4076]; // 4076 bytes (4076+16+4 = 4096)
+} AMCOPPStatusOutput, *LPAMCOPPStatusOutput;
+
+
+[
+ object,
+ local,
+ uuid(6feded3e-0ff1-4901-a2f1-43f7012c8515),
+ pointer_default(unique)
+]
+interface IAMCertifiedOutputProtection : IUnknown
+{
+ HRESULT KeyExchange (
+ [out] GUID* pRandom, // 128-bit random number generated by Graphics Driver
+ [out] BYTE** VarLenCertGH, // Graphics Hardware certificate, memory released by CoTaskMemFree
+ [out] DWORD* pdwLengthCertGH); // Length of Graphics Hardware certificate
+
+ HRESULT SessionSequenceStart(
+ [in] AMCOPPSignature*pSig); // Concatenation of 128-bit random data security session key,
+ // 128-bit random data integrity session key, 32-bit random
+ // starting status sequence number and 32-bit random starting
+ // command sequence number encrypted with the public key of
+ // the graphic hardware. This value is 2048 bits long.
+
+ HRESULT ProtectionCommand(
+ [in] const AMCOPPCommand* cmd); // Encrypted command
+
+ HRESULT ProtectionStatus(
+ [in] const AMCOPPStatusInput* pStatusInput, // Encrypted Status request
+ [out] AMCOPPStatusOutput* pStatusOutput); // Encrypted Status results
+};
+
diff --git a/dxsdk/Include/DShowIDL/bdaiface.idl b/dxsdk/Include/DShowIDL/bdaiface.idl
new file mode 100644
index 00000000..e1d27ca9
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/bdaiface.idl
@@ -0,0 +1,1013 @@
+//------------------------------------------------------------------------------
+// File: BDAIface.idl
+//
+// Desc: This file defines the Ring 3 BDA interfaces that are common to
+// all BDA network and device types.
+//
+// The interfaces specific to a particular Network Type or filter
+// implementation are defined in a separate include file for that
+// Network Type or filter implementation.
+//
+// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------
+// IUnknown import idl
+//---------------------------------------------------------------------
+#ifndef DO_NO_IMPORTS
+import "unknwn.idl";
+import "strmif.idl";
+import "BdaTypes.h";
+#endif
+
+//---------------------------------------------------------------------
+//
+// IBDA_NetworkProvider interface
+//
+// Implemented by a BDA Network Provider
+//
+// Used by a BDA device filter to register itself with
+// a Network Provider and query information about the
+// the current tuning request.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(fd501041-8ebe-11ce-8183-00aa00577da2),
+ pointer_default(unique)
+]
+
+interface IBDA_NetworkProvider : IUnknown
+{
+
+ HRESULT
+ PutSignalSource (
+ [in] ULONG ulSignalSource
+ );
+
+
+ HRESULT
+ GetSignalSource (
+ [in, out] ULONG * pulSignalSource
+ );
+
+ HRESULT
+ GetNetworkType (
+ [in, out] GUID * pguidNetworkType
+ );
+
+ HRESULT
+ PutTuningSpace (
+ [in] REFGUID guidTuningSpace
+ );
+
+ HRESULT
+ GetTuningSpace (
+ [in, out] GUID * pguidTuingSpace
+ );
+
+ HRESULT
+ RegisterDeviceFilter (
+ [in] IUnknown * pUnkFilterControl,
+ [in, out] ULONG * ppvRegisitrationContext
+ );
+
+ HRESULT
+ UnRegisterDeviceFilter (
+ [in] ULONG pvRegistrationContext
+ );
+
+}
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_EthernetFilter interface
+//
+// Implemented by a BDA Network Provider
+//
+// Used by an Ethernet Network Data Sink filter (eg. IPSink) to
+// request that the Network Provider make its best effort to tune
+// to the stream(s) on which a list of Ethernet multicast addresses
+// may be transmitted.
+//
+// Addresses in the address list are byte aligned in Network order.
+// UlcbAddresses will always be an integer multiple of the
+// size of an ethernet address.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(71985F43-1CA1-11d3-9CC8-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_EthernetFilter : IUnknown
+{
+ HRESULT
+ GetMulticastListSize (
+ [in, out] ULONG * pulcbAddresses
+ );
+
+ HRESULT
+ PutMulticastList (
+ [in] ULONG ulcbAddresses,
+ [in, size_is(ulcbAddresses)] BYTE pAddressList []
+ );
+
+ HRESULT
+ GetMulticastList (
+ [in, out] ULONG * pulcbAddresses,
+ [out, size_is(*pulcbAddresses)] BYTE pAddressList []
+ );
+
+ HRESULT
+ PutMulticastMode (
+ [in] ULONG ulModeMask
+ );
+
+ HRESULT
+ GetMulticastMode (
+ [out] ULONG * pulModeMask
+ );
+
+}
+
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_IPV4Filter interface
+//
+// Implemented by a BDA Network Provider
+//
+// Used by an IPv4 Network Data Sink filter to request
+// that the Network Provider make its best effort to tune
+// to the stream(s) on which a list of IPv4 multicast addresses
+// may be transmitted.
+//
+// Addresses in the address list are byte aligned in Network order.
+// UlcbAddresses will always be an integer multiple of the
+// size of an IPv4 address.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(71985F44-1CA1-11d3-9CC8-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_IPV4Filter : IUnknown
+{
+
+ HRESULT
+ GetMulticastListSize (
+ [in, out] ULONG * pulcbAddresses
+ );
+
+ HRESULT
+ PutMulticastList (
+ [in] ULONG ulcbAddresses,
+ [in, size_is(ulcbAddresses)] BYTE pAddressList []
+ );
+
+ HRESULT
+ GetMulticastList (
+ [in, out] ULONG * pulcbAddresses,
+ [out, size_is(*pulcbAddresses)] BYTE pAddressList []
+ );
+
+ HRESULT
+ PutMulticastMode (
+ [in] ULONG ulModeMask
+ );
+
+ HRESULT
+ GetMulticastMode (
+ [out] ULONG* pulModeMask
+ );
+}
+
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_IPV6Filter interface
+//
+// Implemented by a BDA Network Provider
+//
+// Used by an IPv6 Network Data Sink filter to request
+// that the Network Provider make its best effort to tune
+// to the stream(s) on which a list of IPv6 multicast addresses
+// may be transmitted.
+//
+// Addresses in the address list are byte aligned in Network order.
+// UlcbAddresses will always be an integer multiple of the
+// size of an IPv6 address.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(E1785A74-2A23-4fb3-9245-A8F88017EF33),
+ pointer_default(unique)
+]
+
+interface IBDA_IPV6Filter : IUnknown
+{
+
+ HRESULT
+ GetMulticastListSize (
+ [in, out] ULONG * pulcbAddresses
+ );
+
+ HRESULT
+ PutMulticastList (
+ [in] ULONG ulcbAddresses,
+ [in, size_is(ulcbAddresses)] BYTE pAddressList []
+ );
+
+ HRESULT
+ GetMulticastList (
+ [in, out] ULONG * pulcbAddresses,
+ [out, size_is(*pulcbAddresses)] BYTE pAddressList []
+ );
+
+ HRESULT
+ PutMulticastMode (
+ [in] ULONG ulModeMask
+ );
+
+ HRESULT
+ GetMulticastMode (
+ [out] ULONG* pulModeMask
+ );
+}
+
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_DeviceControl interface
+//
+// Implemented by a BDA Device Filter
+//
+// Used by the Network Provider to commit a series of changes
+// on a BDA device filter. The device filter validates and
+// accumulates all changes requested after StartChanges(). It
+// effects the accumulated list of changes when CommitChanges() is
+// called.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(FD0A5AF3-B41D-11d2-9C95-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_DeviceControl : IUnknown
+{
+ HRESULT
+ StartChanges (
+ void
+ );
+
+ HRESULT
+ CheckChanges (
+ void
+ );
+
+ HRESULT
+ CommitChanges (
+ void
+ );
+
+ HRESULT
+ GetChangeState (
+ [in, out] ULONG * pState
+ );
+
+}
+
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_PinControl interface
+//
+// Implemented by a BDA Device Filter's Pin
+//
+// Used by the Network Provider to determine the BDA PinID and
+// PinType on a BDA Filter's Pin
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(0DED49D5-A8B7-4d5d-97A1-12B0C195874D),
+ pointer_default(unique)
+]
+
+interface IBDA_PinControl : IUnknown
+{
+ HRESULT
+ GetPinID (
+ [in, out] ULONG * pulPinID
+ );
+
+ HRESULT
+ GetPinType (
+ [in, out] ULONG * pulPinType
+ );
+
+ HRESULT
+ RegistrationContext (
+ [in, out] ULONG * pulRegistrationCtx
+ );
+}
+
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_SignalProperties interface
+//
+// Implemented by a BDA Device Filter
+//
+// BDA Signal Properties is used by a Network Provider to inform
+// a BDA Device Filter about the current tuning request. The
+// Network Provider will call the Put functions when the BDA
+// device is first registered with the Network Provider and whenever
+// the current tuning request is modified.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(D2F1644B-B409-11d2-BC69-00A0C9EE9E16),
+ pointer_default(unique)
+]
+
+interface IBDA_SignalProperties : IUnknown
+{
+ HRESULT
+ PutNetworkType (
+ [in] REFGUID guidNetworkType
+ );
+
+ HRESULT
+ GetNetworkType (
+ [in, out] GUID * pguidNetworkType
+ );
+
+ HRESULT
+ PutSignalSource (
+ [in] ULONG ulSignalSource
+ );
+
+ HRESULT
+ GetSignalSource (
+ [in, out] ULONG * pulSignalSource
+ );
+
+ HRESULT
+ PutTuningSpace (
+ [in] REFGUID guidTuningSpace
+ );
+
+ HRESULT
+ GetTuningSpace (
+ [in, out] GUID * pguidTuingSpace
+ );
+}
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_SignalStatistics interface
+//
+// Implemented by a BDA Control Node
+//
+// A BDA Control Node may return these properties to describe
+// the condition of a signal that is being received.
+//
+//
+//
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(1347D106-CF3A-428a-A5CB-AC0D9A2A4338),
+ pointer_default(unique)
+]
+
+interface IBDA_SignalStatistics : IUnknown
+{
+ HRESULT
+ put_SignalStrength (
+ [in] LONG lDbStrength
+ );
+
+ HRESULT
+ get_SignalStrength (
+ [in, out] LONG * plDbStrength
+ );
+
+ HRESULT
+ put_SignalQuality (
+ [in] LONG lPercentQuality
+ );
+
+ HRESULT
+ get_SignalQuality (
+ [in, out] LONG * plPercentQuality
+ );
+
+ HRESULT
+ put_SignalPresent (
+ [in] BOOLEAN fPresent
+ );
+
+ HRESULT
+ get_SignalPresent (
+ [in, out] BOOLEAN * pfPresent
+ );
+
+ HRESULT
+ put_SignalLocked (
+ [in] BOOLEAN fLocked
+ );
+
+ HRESULT
+ get_SignalLocked (
+ [in, out] BOOLEAN * pfLocked
+ );
+
+ HRESULT
+ put_SampleTime (
+ [in] LONG lmsSampleTime
+ );
+
+ HRESULT
+ get_SampleTime (
+ [in, out] LONG * plmsSampleTime
+ );
+}
+
+
+//---------------------------------------------------------------------
+//
+// IBDA_Topology interface
+//
+// Implemented by a BDA Device Filter
+//
+// Used by the Network Provider to query a BDA Device Filter's
+// possible topologies (template topology) and to configure
+// the device with an appropriate topology for the current
+// tuning request. It is also used to get an IUnknown to
+// a control node which may be used to set specific tuning
+// information.
+//
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(79B56888-7FEA-4690-B45D-38FD3C7849BE),
+ pointer_default(unique)
+]
+
+interface IBDA_Topology : IUnknown
+{
+ HRESULT
+ GetNodeTypes (
+ [in, out] ULONG * pulcNodeTypes,
+ [in] ULONG ulcNodeTypesMax,
+ [in, out, size_is (ulcNodeTypesMax)] ULONG rgulNodeTypes[]
+ );
+
+ HRESULT
+ GetNodeDescriptors (
+ [in, out] ULONG * ulcNodeDescriptors,
+ [in] ULONG ulcNodeDescriptorsMax,
+ [in, out, size_is (ulcNodeDescriptorsMax)] BDANODE_DESCRIPTOR rgNodeDescriptors[]
+ );
+
+ HRESULT
+ GetNodeInterfaces (
+ [in] ULONG ulNodeType,
+ [in, out] ULONG * pulcInterfaces,
+ [in] ULONG ulcInterfacesMax,
+ [in, out, size_is (ulcInterfacesMax)] GUID rgguidInterfaces[]
+ );
+
+ HRESULT
+ GetPinTypes (
+ [in, out] ULONG * pulcPinTypes,
+ [in] ULONG ulcPinTypesMax,
+ [in, out, size_is (ulcPinTypesMax)] ULONG rgulPinTypes[]
+ );
+
+ HRESULT
+ GetTemplateConnections (
+ [in, out] ULONG * pulcConnections,
+ [in] ULONG ulcConnectionsMax,
+ [in, out, size_is (ulcConnectionsMax)] BDA_TEMPLATE_CONNECTION rgConnections[]
+ );
+
+ HRESULT
+ CreatePin (
+ [in] ULONG ulPinType,
+ [in, out] ULONG * pulPinId
+ );
+
+ HRESULT
+ DeletePin (
+ [in] ULONG ulPinId
+ );
+
+ HRESULT
+ SetMediaType (
+ [in] ULONG ulPinId,
+ [in] AM_MEDIA_TYPE * pMediaType
+ );
+
+ HRESULT
+ SetMedium (
+ [in] ULONG ulPinId,
+ [in] REGPINMEDIUM * pMedium
+ );
+
+ HRESULT
+ CreateTopology (
+ [in] ULONG ulInputPinId,
+ [in] ULONG ulOutputPinId
+ );
+
+ HRESULT
+ GetControlNode (
+ [in] ULONG ulInputPinId,
+ [in] ULONG ulOutputPinId,
+ [in] ULONG ulNodeType,
+ [in, out] IUnknown ** ppControlNode
+ );
+}
+
+//---------------------------------------------------------------------
+// IBDA_VoidTransform interface
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_VoidTransform : IUnknown
+{
+ HRESULT
+ Start (
+ void
+ );
+
+ HRESULT
+ Stop (
+ void
+ );
+
+}
+
+//---------------------------------------------------------------------
+// IBDA_NullTransform interface
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_NullTransform : IUnknown
+{
+ HRESULT
+ Start (
+ void
+ );
+
+ HRESULT
+ Stop (
+ void
+ );
+
+}
+
+
+//---------------------------------------------------------------------
+// IBDA_FrequencyFilter interface
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(71985F47-1CA1-11d3-9CC8-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_FrequencyFilter : IUnknown
+{
+ HRESULT
+ put_Autotune (
+ [in] ULONG ulTransponder
+ );
+
+ HRESULT
+ get_Autotune (
+ [in, out] ULONG * pulTransponder
+ );
+
+ HRESULT
+ put_Frequency (
+ [in] ULONG ulFrequency
+ );
+
+ HRESULT
+ get_Frequency (
+ [in, out] ULONG * pulFrequency
+ );
+
+ HRESULT
+ put_Polarity (
+ [in] Polarisation Polarity
+ );
+
+ HRESULT
+ get_Polarity (
+ [in, out] Polarisation * pPolarity
+ );
+
+ HRESULT
+ put_Range (
+ [in] ULONG ulRange
+ );
+
+ HRESULT
+ get_Range (
+ [in, out] ULONG * pulRange
+ );
+
+ HRESULT
+ put_Bandwidth (
+ [in] ULONG ulBandwidth
+ );
+
+ HRESULT
+ get_Bandwidth (
+ [in, out] ULONG * pulBandwidth
+ );
+
+ HRESULT
+ put_FrequencyMultiplier (
+ [in] ULONG ulMultiplier
+ );
+
+ HRESULT
+ get_FrequencyMultiplier (
+ [in, out] ULONG * pulMultiplier
+ );
+}
+
+
+//---------------------------------------------------------------------
+// IBDA_LNBInfo interface
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(992CF102-49F9-4719-A664-C4F23E2408F4),
+ pointer_default(unique)
+]
+
+interface IBDA_LNBInfo : IUnknown
+{
+ HRESULT
+ put_LocalOscilatorFrequencyLowBand (
+ [in] ULONG ulLOFLow
+ );
+
+ HRESULT
+ get_LocalOscilatorFrequencyLowBand (
+ [in, out] ULONG * pulLOFLow
+ );
+
+ HRESULT
+ put_LocalOscilatorFrequencyHighBand (
+ [in] ULONG ulLOFHigh
+ );
+
+ HRESULT
+ get_LocalOscilatorFrequencyHighBand (
+ [in, out] ULONG * pulLOFHigh
+ );
+
+ HRESULT
+ put_HighLowSwitchFrequency (
+ [in] ULONG ulSwitchFrequency
+ );
+
+ HRESULT
+ get_HighLowSwitchFrequency (
+ [in, out] ULONG * pulSwitchFrequency
+ );
+}
+
+
+//---------------------------------------------------------------------
+// IBDA_AutoDemodulate interface
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0),
+ pointer_default(unique)
+]
+
+interface IBDA_AutoDemodulate : IUnknown
+{
+ HRESULT
+ put_AutoDemodulate (
+ void
+ );
+}
+
+//---------------------------------------------------------------------
+// IBDA_DigitalDemodulator interface
+//---------------------------------------------------------------------
+[
+ object,
+ uuid(EF30F379-985B-4d10-B640-A79D5E04E1E0),
+ pointer_default(unique)
+]
+
+interface IBDA_DigitalDemodulator : IUnknown
+{
+ HRESULT
+ put_ModulationType (
+ [in] ModulationType * pModulationType
+ );
+
+ HRESULT
+ get_ModulationType (
+ [in, out] ModulationType * pModulationType
+ );
+
+ HRESULT
+ put_InnerFECMethod (
+ [in] FECMethod * pFECMethod
+ );
+
+ HRESULT
+ get_InnerFECMethod (
+ [in, out] FECMethod * pFECMethod
+ );
+
+ HRESULT
+ put_InnerFECRate (
+ [in] BinaryConvolutionCodeRate * pFECRate
+ );
+
+ HRESULT
+ get_InnerFECRate (
+ [in, out] BinaryConvolutionCodeRate * pFECRate
+ );
+
+ HRESULT
+ put_OuterFECMethod (
+ [in] FECMethod * pFECMethod
+ );
+
+ HRESULT
+ get_OuterFECMethod (
+ [in, out] FECMethod * pFECMethod
+ );
+
+ HRESULT
+ put_OuterFECRate (
+ [in] BinaryConvolutionCodeRate * pFECRate
+ );
+
+ HRESULT
+ get_OuterFECRate (
+ [in, out] BinaryConvolutionCodeRate * pFECRate
+ );
+
+ HRESULT
+ put_SymbolRate (
+ [in] ULONG * pSymbolRate
+ );
+
+ HRESULT
+ get_SymbolRate (
+ [in, out] ULONG * pSymbolRate
+ );
+
+ HRESULT
+ put_SpectralInversion (
+ [in] SpectralInversion * pSpectralInversion
+ );
+
+ HRESULT
+ get_SpectralInversion (
+ [in, out] SpectralInversion * pSpectralInversion
+ );
+}
+
+typedef enum
+{
+ KSPROPERTY_IPSINK_MULTICASTLIST,
+ KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION,
+ KSPROPERTY_IPSINK_ADAPTER_ADDRESS
+
+} KSPROPERTY_IPSINK;
+
+
+
+//---------------------------------------------------------------------
+// IBDA_IPSinkControl interface (mutlimedia\filters.ks\ipsink)
+// IBDA_IPSinkInfo interface
+//
+// IBDA_IPSinkControl is no longer being supported for Ring3 clients.
+// Use the BDA_IPSinkInfo interface instead.
+//---------------------------------------------------------------------
+
+[
+ object,
+ uuid(3F4DC8E2-4050-11d3-8F4B-00C04F7971E2),
+ pointer_default(unique),
+ helpstring("Not supported - Use IBDA_IPSinkInfo instead")
+]
+interface IBDA_IPSinkControl : IUnknown
+{
+ HRESULT GetMulticastList (
+ [in, out] unsigned long *pulcbSize,
+ [in, out] BYTE **pbBuffer
+ );
+
+
+ HRESULT GetAdapterIPAddress (
+ [in,out] unsigned long *pulcbSize,
+ [in,out] BYTE **pbBuffer
+ );
+
+}
+
+[
+ object,
+ uuid(A750108F-492E-4d51-95F7-649B23FF7AD7),
+ pointer_default(unique)
+]
+interface IBDA_IPSinkInfo : IUnknown
+{
+ HRESULT get_MulticastList ( // returns N 6-byte 802.3 IP addreses.
+ [in, out] ULONG * pulcbAddresses, // 6*N
+ [out, size_is(*pulcbAddresses)] BYTE **ppbAddressList // Allocated by caller, must deallocate in callee with CoTaskMemFree()
+ );
+
+ HRESULT get_AdapterIPAddress (
+ [out] BSTR *pbstrBuffer
+ );
+
+ HRESULT get_AdapterDescription (
+ [out] BSTR *pbstrBuffer
+ );
+}
+//
+// mpeg-2 demultiplexer-specific interfaces follow
+//
+
+//---------------------------------------------------------------------
+// IEnumPIDMap interface
+//---------------------------------------------------------------------
+
+#ifdef REMOVE_THESE
+typedef enum {
+ MEDIA_TRANSPORT_PACKET, // complete TS packet e.g. pass-through mode
+ MEDIA_ELEMENTARY_STREAM, // PES payloads; audio/video only
+ MEDIA_MPEG2_PSI, // PAT, PMT, CAT, Private
+ MEDIA_TRANSPORT_PAYLOAD // gathered TS packet payloads (PES packets, etc...)
+} MEDIA_SAMPLE_CONTENT ;
+
+typedef struct {
+ ULONG ulPID ;
+ MEDIA_SAMPLE_CONTENT MediaSampleContent ;
+} PID_MAP ;
+#endif // REMOVE_THESE
+
+[
+ object,
+ uuid (afb6c2a2-2c41-11d3-8a60-0000f81e0e4a),
+ pointer_default(unique)
+]
+interface IEnumPIDMap : IUnknown
+{
+ HRESULT
+ Next (
+ [in] ULONG cRequest,
+ [in, out, size_is (cRequest)] PID_MAP * pPIDMap,
+ [out] ULONG * pcReceived
+ ) ;
+
+ HRESULT
+ Skip (
+ [in] ULONG cRecords
+ ) ;
+
+ HRESULT
+ Reset (
+ ) ;
+
+ HRESULT
+ Clone (
+ [out] IEnumPIDMap ** ppIEnumPIDMap
+ ) ;
+} ;
+
+//---------------------------------------------------------------------
+// IMPEG2PIDMap interface
+//---------------------------------------------------------------------
+
+[
+ object,
+ uuid (afb6c2a1-2c41-11d3-8a60-0000f81e0e4a),
+ pointer_default(unique)
+]
+interface IMPEG2PIDMap : IUnknown
+{
+ HRESULT
+ MapPID (
+ [in] ULONG culPID,
+ [in] ULONG * pulPID,
+ [in] MEDIA_SAMPLE_CONTENT MediaSampleContent
+ ) ;
+
+ HRESULT
+ UnmapPID (
+ [in] ULONG culPID,
+ [in] ULONG * pulPID
+ ) ;
+
+ HRESULT
+ EnumPIDMap (
+ [out] IEnumPIDMap ** pIEnumPIDMap
+ ) ;
+} ;
+
+//---------------------------------------------------------------------
+// IFrequencyMap interface
+// Currently implemented on the TIF. The interface can be QIed on the NP
+//---------------------------------------------------------------------
+
+
+ [
+ object,
+ uuid(06FB45C1-693C-4ea7-B79F-7A6A54D8DEF2),
+ helpstring("IFrequencyMap Interface"),
+ pointer_default(unique),
+ hidden, restricted
+ ]
+
+ interface IFrequencyMap : IUnknown
+ {
+ [helpstring("method get_FrequencyMapping")]
+ HRESULT
+ get_FrequencyMapping(
+ [out] ULONG* ulCount,
+ [out, size_is(1, *ulCount)] ULONG** ppulList
+ );
+ [helpstring("method put_FrequencyMapping")]
+ HRESULT
+ put_FrequencyMapping(
+ [in] ULONG ulCount,
+ [in, size_is(ulCount)] ULONG pList[]
+ );
+ [helpstring("method get_CountryCode")]
+ HRESULT
+ get_CountryCode(
+ [out] ULONG *pulCountryCode
+ );
+ [helpstring("method put_CountryCode")]
+ HRESULT
+ put_CountryCode(
+ [in] ULONG ulCountryCode
+ );
+
+ [helpstring("method get_DefaultFrequencyMapping")]
+ HRESULT
+ get_DefaultFrequencyMapping(
+ [in] ULONG ulCountryCode,
+ [out] ULONG* pulCount,
+ [out, size_is(1, *pulCount)] ULONG** ppulList
+ );
+
+
+ [helpstring("method get_CountryCodeList")]
+ HRESULT
+ get_CountryCodeList(
+ [out] ULONG* pulCount,
+ [out, size_is(1, *pulCount)] ULONG** ppulList
+ );
+
+
+ };
+
+
+
diff --git a/dxsdk/Include/DShowIDL/control.odl b/dxsdk/Include/DShowIDL/control.odl
new file mode 100644
index 00000000..4fba88cf
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/control.odl
@@ -0,0 +1,912 @@
+//==========================================================================;
+//
+// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
+// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
+// PURPOSE.
+//
+// Copyright (c) 1992 - 2002 Microsoft Corporation. All Rights Reserved.
+//
+//--------------------------------------------------------------------------;
+
+// Neutral/English language type library for basic Quartz control interfaces
+
+// the quartz type library defines the basic control interfaces
+[
+ uuid(56a868b0-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("ActiveMovie control type library"),
+ lcid(0x0000),
+ version(1.0)
+]
+library QuartzTypeLib
+{
+ importlib("STDOLE2.TLB");
+
+ // types are restricted to be automation-compatible
+ typedef double REFTIME; // ReferenceTime
+ typedef LONG_PTR OAEVENT; // should be a HANDLE
+ typedef LONG_PTR OAHWND; // should be an hwnd
+
+ // from strmif.idl
+ typedef long OAFilterState;
+
+ // collection interface - represents a collection of IUnknowns
+ // this is used below to collect filter-info objects, registry-filters
+ // pin-info objects and wrapped media type objects
+ [
+ uuid(56a868b9-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("Collection"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IAMCollection : IDispatch
+ {
+ // number of items in collection
+ [propget]
+ HRESULT Count(
+ [out, retval] LONG* plCount);
+
+ // return IUnknown for contained item by index
+ HRESULT Item(
+ [in] long lItem,
+ [out] IUnknown** ppUnk);
+
+ // return IUnknown for an object that implements IEnumVARIANT on
+ // this collection
+ [propget]
+ HRESULT _NewEnum(
+ [out, retval] IUnknown** ppUnk);
+ }
+
+
+ // core control providing state control
+ [
+ uuid(56a868b1-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IMediaControl interface"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IMediaControl : IDispatch
+ {
+ // methods
+ HRESULT Run();
+ HRESULT Pause();
+ HRESULT Stop();
+
+ //returns the state. same semantics as IMediaFilter::GetState
+
+ HRESULT GetState(
+ [in] LONG msTimeout,
+ [out] OAFilterState* pfs);
+
+ // adds and connects filters needed to play the specified file
+ // (same as IFilterGraph::RenderFile)
+ HRESULT RenderFile(
+ [in] BSTR strFilename);
+
+ // adds to the graph the source filter that can read this file,
+ // and returns an IFilterInfo object for it (actually returns
+ // an IDispatch for the IFilterInfo object).
+ HRESULT AddSourceFilter(
+ [in] BSTR strFilename,
+ [out] IDispatch**ppUnk);
+
+ // get a collection of IFilterInfo objects representing the
+ // filters in the graph (returns IDispatch for an object
+ // that supports IAMCollection
+ [propget]
+ HRESULT FilterCollection(
+ [out, retval] IDispatch** ppUnk);
+
+ // get a collection of IRegFilter objects representing the
+ // filters available in the registry
+ [propget]
+ HRESULT RegFilterCollection(
+ [out, retval] IDispatch** ppUnk);
+
+ HRESULT StopWhenReady();
+ }
+
+
+ // provides an event notification scheme passing events
+ // asynchronously to applications. See also IMediaEventSink in
+ // strmif.idl and sdk\h\evcodes.h.
+ //
+ // this interface behaves as if events are held on a queue. A call to
+ // IMediaEventSink::Notify will place an event on this queue. Calling
+ // GetEvent removes the first item off the queue and returns it. Items are
+ // returned in the order they were queued (there is no priority scheme).
+ // The event handle is in a signalled state iff the queue is non-empty.
+ //
+ // Apps that issue multiple Run calls without always picking up the
+ // completion events are advised to call GetEvent or WaitForCompletion
+ // (with a 0 timeout) repeatedly to remove all events from the queue
+ // when in stopped or paused state before each Run method.
+ //
+ // Parameters to events are actually LONG, IUnknown* or BSTR. You need to
+ // look at evcode.h for details of parameters to a specific event code.
+ // In order to correctly free resources, always call FreeEventParams
+ // after receiving an event.
+ //
+
+ [
+ uuid(56a868b6-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IMediaEvent interface"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IMediaEvent : IDispatch
+ {
+ // get back the event handle. This is manual-reset
+ // (don't - it's reset by the event mechanism) and remains set
+ // when events are queued, and reset when the queue is empty.
+ HRESULT GetEventHandle(
+ [out] OAEVENT * hEvent);
+
+ // remove the next event notification from the head of the queue and
+ // return it. Waits up to msTimeout millisecs if there are no events.
+ // if a timeout occurs without any events, this method will return
+ // E_ABORT, and the value of the event code and other parameters
+ // is undefined.
+ //
+ // If this call returns successfully the caller MUST call
+ // FreeEventParams(lEventCode, lParam1, lParam2) to release
+ // resources held inside the event arguments
+ //
+ HRESULT GetEvent(
+ [out] long * lEventCode,
+ [out] LONG_PTR * lParam1,
+ [out] LONG_PTR * lParam2,
+ [in] long msTimeout
+ );
+
+ // Calls GetEvent repeatedly discarding events until it finds a
+ // completion event (EC_COMPLETE, EC_ERRORABORT, or EC_USERABORT).
+ // The completion event is removed from the queue and returned
+ // in pEvCode. Note that the object is still in running mode until
+ // a Pause or Stop call is made.
+ // If the timeout occurs, *pEvCode will be 0 and E_ABORT will be
+ // returned.
+ HRESULT WaitForCompletion(
+ [in] long msTimeout,
+ [out] long * pEvCode);
+
+ // cancels any system handling of the specified event code
+ // and ensures that the events are passed straight to the application
+ // (via GetEvent) and not handled. A good example of this is
+ // EC_REPAINT: default handling for this ensures the painting of the
+ // window and does not get posted to the app.
+ HRESULT CancelDefaultHandling(
+ [in] long lEvCode);
+
+ // restore the normal system default handling that may have been
+ // cancelled by CancelDefaultHandling().
+ HRESULT RestoreDefaultHandling( [in] long lEvCode);
+
+ // Free any resources associated with the parameters to an event.
+ // Event parameters may be LONGs, IUnknown* or BSTR. No action
+ // is taken with LONGs. IUnknown are passed addrefed and need a
+ // Release call. BSTR are allocated by the task allocator and will be
+ // freed by calling the task allocator.
+ HRESULT FreeEventParams(
+ [in] long lEvCode,
+ [in] LONG_PTR lParam1,
+ [in] LONG_PTR lParam2
+ );
+ }
+
+ [
+ uuid(56a868c0-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IMediaEventEx interface"),
+ odl
+ ]
+ interface IMediaEventEx : IMediaEvent
+ {
+
+ // Register a window to send messages to when events occur
+ // Parameters:
+ //
+ // hwnd - handle of window to notify -
+ // pass NULL to stop notification
+ // lMsg - Message id to pass messages with
+ // lInstanceData - will come back in lParam
+ //
+ // The event information must still be retrived by a call
+ // to GetEvent when the window message is received.
+ //
+ // Multiple events may be notified with one window message.
+ //
+ HRESULT SetNotifyWindow(
+ [in] OAHWND hwnd,
+ [in] long lMsg,
+ [in] LONG_PTR lInstanceData
+ );
+
+ // Turn events notification on or off
+ // lNoNotify = 0x00 event notification is ON
+ // lNoNotify = 0x01 event notification is OFF. The
+ // handle returned by GetEventHandle will be signalled at
+ // end of stream
+ HRESULT SetNotifyFlags(
+ [in] long lNoNotifyFlags
+ );
+ HRESULT GetNotifyFlags(
+ [out] long *lplNoNotifyFlags
+ );
+ }
+
+
+
+
+ // seek/cueing for positional media
+ [
+ uuid(56a868b2-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IMediaPosition interface"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IMediaPosition : IDispatch
+ {
+ // properties
+
+ [propget]
+ HRESULT Duration(
+ [out, retval] REFTIME* plength);
+
+ [propput]
+ HRESULT CurrentPosition(
+ [in] REFTIME llTime);
+
+ [propget]
+ HRESULT CurrentPosition(
+ [out, retval] REFTIME* pllTime);
+
+ [propget]
+ HRESULT StopTime(
+ [out, retval] REFTIME* pllTime);
+ [propput]
+ HRESULT StopTime(
+ [in] REFTIME llTime);
+
+ [propget]
+ HRESULT PrerollTime(
+ [out, retval] REFTIME* pllTime);
+ [propput]
+ HRESULT PrerollTime(
+ [in] REFTIME llTime);
+
+ [propput]
+ HRESULT Rate(
+ [in] double dRate);
+ [propget]
+ HRESULT Rate(
+ [out, retval] double * pdRate);
+
+ HRESULT CanSeekForward([out, retval] LONG *pCanSeekForward);
+ HRESULT CanSeekBackward([out, retval] LONG *pCanSeekBackward);
+ }
+
+ // basic audio-related functionality
+ [
+ uuid(56a868b3-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IBasicAudio interface"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IBasicAudio : IDispatch
+ {
+ // properties
+
+ [propput]
+ HRESULT Volume(
+ [in] long lVolume);
+ [propget]
+ HRESULT Volume(
+ [out, retval] long * plVolume);
+
+ [propput]
+ HRESULT Balance(
+ [in] long lBalance);
+ [propget]
+ HRESULT Balance(
+ [out, retval] long * plBalance);
+ }
+
+ // basic window-related functionality
+ [
+ uuid(56a868b4-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IVideoWindow interface"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IVideoWindow : IDispatch
+ {
+ // properties
+
+ // set and get the window title caption
+
+ [propput]
+ HRESULT Caption([in] BSTR strCaption);
+ [propget]
+ HRESULT Caption([out, retval] BSTR *strCaption);
+
+ // change the window styles (as per Win32)
+
+ [propput]
+ HRESULT WindowStyle([in] long WindowStyle);
+ [propget]
+ HRESULT WindowStyle([out, retval] long *WindowStyle);
+
+ // change the extended window styles (as per Win32)
+
+ [propput]
+ HRESULT WindowStyleEx([in] long WindowStyleEx);
+ [propget]
+ HRESULT WindowStyleEx([out, retval] long *WindowStyleEx);
+
+ [propput]
+ HRESULT AutoShow([in] long AutoShow);
+ [propget]
+ HRESULT AutoShow([out, retval] long *AutoShow);
+
+ // change the window state (as per Win32)
+
+ [propput]
+ HRESULT WindowState([in] long WindowState);
+ [propget]
+ HRESULT WindowState([out, retval] long *WindowState);
+
+ // realise the palette in the background
+
+ [propput]
+ HRESULT BackgroundPalette([in] long BackgroundPalette);
+ [propget]
+ HRESULT BackgroundPalette([out, retval] long *pBackgroundPalette);
+
+ // affect the visibility of the window
+
+ [propput]
+ HRESULT Visible([in] long Visible);
+ [propget]
+ HRESULT Visible([out, retval] long *pVisible);
+
+ // change the desktop position of the video window
+
+ [propput]
+ HRESULT Left([in] long Left);
+ [propget]
+ HRESULT Left([out, retval] long *pLeft);
+
+ [propput]
+ HRESULT Width([in] long Width);
+ [propget]
+ HRESULT Width([out, retval] long *pWidth);
+
+ [propput]
+ HRESULT Top([in] long Top);
+ [propget]
+ HRESULT Top([out, retval] long *pTop);
+
+ [propput]
+ HRESULT Height([in] long Height);
+ [propget]
+ HRESULT Height([out, retval] long *pHeight);
+
+ // change the owning window of the video
+
+ [propput]
+ HRESULT Owner([in] OAHWND Owner);
+ [propget]
+ HRESULT Owner([out, retval] OAHWND *Owner);
+
+ // change the window to receive posted messages
+
+ [propput]
+ HRESULT MessageDrain([in] OAHWND Drain);
+ [propget]
+ HRESULT MessageDrain([out, retval] OAHWND *Drain);
+
+ [propget]
+ HRESULT BorderColor([out, retval] long *Color);
+
+ [propput]
+ HRESULT BorderColor([in] long Color);
+
+ [propget]
+ HRESULT FullScreenMode([out, retval] long *FullScreenMode);
+
+ [propput]
+ HRESULT FullScreenMode([in] long FullScreenMode);
+
+ // methods
+
+ // ask the renderer to grab it's window the foreground
+ // and optionally also give the window the input focus
+ HRESULT SetWindowForeground([in] long Focus);
+
+ // owners should pass WM_PALETTECHANGED and WM_SYSCOLORCHANGE
+ // messages on the filter graph so they can be distributed
+ // otherwise child renderers never see these messages go by
+
+ HRESULT NotifyOwnerMessage([in] OAHWND hwnd,
+ [in] long uMsg,
+ [in] LONG_PTR wParam,
+ [in] LONG_PTR lParam
+ );
+
+ // get and set the window position on the desktop
+
+ HRESULT SetWindowPosition([in] long Left,
+ [in] long Top,
+ [in] long Width,
+ [in] long Height);
+
+ HRESULT GetWindowPosition([out] long *pLeft,
+ [out] long *pTop,
+ [out] long *pWidth,
+ [out] long *pHeight);
+
+ // get the ideal sizes for the video image playback (client) area
+
+ HRESULT GetMinIdealImageSize([out] long *pWidth,[out] long *pHeight);
+ HRESULT GetMaxIdealImageSize([out] long *pWidth,[out] long *pHeight);
+
+ // get the restored window size when we're maximised or iconic
+
+ HRESULT GetRestorePosition([out] long *pLeft,
+ [out] long *pTop,
+ [out] long *pWidth,
+ [out] long *pHeight);
+
+ // show and hide cursors useful when fullscreen
+ HRESULT HideCursor([in] long HideCursor);
+ HRESULT IsCursorHidden([out] long *CursorHidden);
+ }
+
+ // basic video-related functionality
+ [
+ uuid(56a868b5-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IBasicVideo interface"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IBasicVideo : IDispatch
+ {
+ // properties
+
+ // Video specific (approximate) bit and frame rates
+
+ [propget]
+ HRESULT AvgTimePerFrame([out, retval] REFTIME *pAvgTimePerFrame);
+
+ [propget]
+ HRESULT BitRate([out, retval] long *pBitRate);
+
+ [propget]
+ HRESULT BitErrorRate([out, retval] long *pBitErrorRate);
+
+ // read the native video size
+
+ [propget]
+ HRESULT VideoWidth([out, retval] long *pVideoWidth);
+
+ [propget]
+ HRESULT VideoHeight([out, retval] long *pVideoHeight);
+
+ // change the source rectangle for the video
+
+ [propput]
+ HRESULT SourceLeft([in] long SourceLeft);
+ [propget]
+ HRESULT SourceLeft([out, retval] long *pSourceLeft);
+
+ [propput]
+ HRESULT SourceWidth([in] long SourceWidth);
+ [propget]
+ HRESULT SourceWidth([out, retval] long *pSourceWidth);
+
+ [propput]
+ HRESULT SourceTop([in] long SourceTop);
+ [propget]
+ HRESULT SourceTop([out, retval] long *pSourceTop);
+
+ [propput]
+ HRESULT SourceHeight([in] long SourceHeight);
+ [propget]
+ HRESULT SourceHeight([out, retval] long *pSourceHeight);
+
+ // change the destination rectangle for the video
+
+ [propput]
+ HRESULT DestinationLeft([in] long DestinationLeft);
+ [propget]
+ HRESULT DestinationLeft([out, retval] long *pDestinationLeft);
+
+ [propput]
+ HRESULT DestinationWidth([in] long DestinationWidth);
+ [propget]
+ HRESULT DestinationWidth([out, retval] long *pDestinationWidth);
+
+ [propput]
+ HRESULT DestinationTop([in] long DestinationTop);
+ [propget]
+ HRESULT DestinationTop([out, retval] long *pDestinationTop);
+
+ [propput]
+ HRESULT DestinationHeight([in] long DestinationHeight);
+ [propget]
+ HRESULT DestinationHeight([out, retval] long *pDestinationHeight);
+
+ // methods
+
+ // get and set the source rectangle position
+
+ HRESULT SetSourcePosition([in] long Left,
+ [in] long Top,
+ [in] long Width,
+ [in] long Height);
+
+ HRESULT GetSourcePosition([out] long *pLeft,
+ [out] long *pTop,
+ [out] long *pWidth,
+ [out] long *pHeight);
+
+ HRESULT SetDefaultSourcePosition();
+
+ // get and set the destination rectangle position
+
+ HRESULT SetDestinationPosition([in] long Left,
+ [in] long Top,
+ [in] long Width,
+ [in] long Height);
+
+ HRESULT GetDestinationPosition([out] long *pLeft,
+ [out] long *pTop,
+ [out] long *pWidth,
+ [out] long *pHeight);
+
+ HRESULT SetDefaultDestinationPosition();
+
+ // get the native video dimensions
+
+ HRESULT GetVideoSize([out] long *pWidth,[out] long *pHeight);
+
+ // get all or some of the current video palette
+
+ HRESULT GetVideoPaletteEntries([in] long StartIndex,
+ [in] long Entries,
+ [out] long *pRetrieved,
+ [out] long *pPalette);
+
+ HRESULT GetCurrentImage([in,out] long *pBufferSize,
+ [out] long *pDIBImage);
+
+ // are we using a default source or destination
+
+ HRESULT IsUsingDefaultSource();
+ HRESULT IsUsingDefaultDestination();
+ }
+
+ // interface extension to IBasicVideo to return preferred aspect ratio
+ [
+ uuid(329bb360-f6ea-11d1-9038-00a0c9697298),
+ helpstring("IBasicVideo2"),
+ odl
+ ]
+ interface IBasicVideo2 : IBasicVideo
+ {
+ // This may not match the native video dimensions because of
+ // non-square pixels or whatever.
+ // The video may not always be displayed in the preferred
+ // aspect ratio for performance reasons
+
+ HRESULT GetPreferredAspectRatio([out] long *plAspectX,
+ [out] long *plAspectY);
+ }
+
+ // interface returned to a command that has been queued via IQueueCommand
+ [
+ uuid(56a868b8-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IDeferredCommand"),
+ odl
+ ]
+ interface IDeferredCommand : IUnknown
+ {
+ HRESULT Cancel();
+ HRESULT Confidence(
+ [out] LONG* pConfidence);
+ HRESULT Postpone(
+ [in] REFTIME newtime);
+ // return value is S_OK if completed. phrResult is set to the
+ // result of the deferred command.
+ HRESULT GetHResult(
+ [out] HRESULT* phrResult);
+ };
+
+ // queue an IDispatch-based command for execution at a specified time
+ [
+ uuid(56a868b7-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("IQueueCommand"),
+ odl
+ ]
+ interface IQueueCommand : IUnknown
+ {
+ HRESULT InvokeAtStreamTime(
+ [out] IDeferredCommand** pCmd,
+ [in] REFTIME time, // at this streamtime
+ [in] GUID* iid, // call this interface
+ [in] long dispidMethod, // ..and this method
+ [in] short wFlags, // method/property
+ [in] long cArgs, // count of args
+ [in] VARIANT* pDispParams, // actual args
+ [in, out] VARIANT* pvarResult, // return value
+ [out] short* puArgErr // which arg in error
+ );
+
+ HRESULT InvokeAtPresentationTime(
+ [out] IDeferredCommand** pCmd,
+ [in] REFTIME time, // at this presentation time
+ [in] GUID* iid, // call this interface
+ [in] long dispidMethod, // ..and this method
+ [in] short wFlags, // method/property
+ [in] long cArgs, // count of args
+ [in] VARIANT* pDispParams, // actual args
+ [in, out] VARIANT* pvarResult, // return value
+ [out] short* puArgErr // which arg in error
+ );
+
+ };
+
+
+
+ // the filgraph object (CLSID_Filgraph)
+ [
+ uuid(e436ebb3-524f-11ce-9f53-0020af0ba770),
+ helpstring("Filtergraph type info")
+ ]
+ coclass FilgraphManager
+ {
+ [default] interface IMediaControl;
+ interface IMediaEvent;
+ interface IMediaPosition;
+ interface IBasicAudio;
+ interface IBasicVideo;
+ interface IVideoWindow;
+
+ };
+
+
+ // represents a filter (you can't QI for IBaseFilter from this object)
+ [
+ uuid(56a868ba-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("FilterInfo"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IFilterInfo : IDispatch
+ {
+ // find a pin given an id - returns an object supporting
+ // IPinInfo
+ HRESULT FindPin(
+ [in] BSTR strPinID,
+ [out] IDispatch** ppUnk);
+
+ // filter name
+ [propget]
+ HRESULT Name(
+ [out, retval] BSTR* strName);
+
+ // Vendor info string
+ [propget]
+ HRESULT VendorInfo(
+ [out, retval] BSTR* strVendorInfo);
+
+ // returns the actual filter object (supports IBaseFilter)
+ [propget]
+ HRESULT Filter(
+ [out, retval] IUnknown **ppUnk);
+
+ // returns an IAMCollection object containing the PinInfo objects
+ // for this filter
+ [propget]
+ HRESULT Pins(
+ [out, retval] IDispatch ** ppUnk);
+
+ // returns -1 if true or 0 if false (OATRUE/FALSE)
+ [propget]
+ HRESULT IsFileSource(
+ [out, retval] LONG * pbIsSource);
+
+ [propget]
+ HRESULT Filename(
+ [out, retval] BSTR* pstrFilename);
+
+ [propput]
+ HRESULT Filename(
+ [in] BSTR strFilename);
+ }
+
+ [
+ uuid(56a868bb-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("Registry Filter Info"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IRegFilterInfo : IDispatch
+ {
+ // get the name of this filter
+ [propget]
+ HRESULT Name(
+ [out, retval] BSTR* strName);
+
+
+ // make an instance of this filter, add it to the graph and
+ // return an IFilterInfo for it.
+ HRESULT Filter(
+ [out] IDispatch** ppUnk);
+ }
+
+ // wrapper for a media type
+ [
+ uuid(56a868bc-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("Media Type"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IMediaTypeInfo : IDispatch
+ {
+ // get the major type GUID as a string
+ [propget]
+ HRESULT Type(
+ [out, retval] BSTR* strType);
+
+ // get the subtype GUID as a string
+ [propget]
+ HRESULT Subtype(
+ [out, retval] BSTR* strType);
+ }
+
+ [
+ uuid(56a868bd-0ad4-11ce-b03a-0020af0ba770),
+ helpstring("Pin Info"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IPinInfo : IDispatch
+ {
+ // get the pin object (IUnknown for an object that
+ // supports IPin
+ [propget]
+ HRESULT Pin(
+ [out, retval] IUnknown** ppUnk);
+
+ // get the PinInfo object for the pin we are connected to
+ [propget]
+ HRESULT ConnectedTo(
+ [out, retval] IDispatch** ppUnk);
+
+ // get the media type on this connection - returns an
+ // object supporting IMediaTypeInfo
+ [propget]
+ HRESULT ConnectionMediaType(
+ [out, retval] IDispatch** ppUnk);
+
+
+ // return the FilterInfo object for the filter this pin
+ // is part of
+ [propget]
+ HRESULT FilterInfo(
+ [out, retval] IDispatch** ppUnk);
+
+ // get the name of this pin
+ [propget]
+ HRESULT Name(
+ [out, retval] BSTR* ppUnk);
+
+ // pin direction
+ [propget]
+ HRESULT Direction(
+ [out, retval] LONG *ppDirection);
+
+ // PinID - can pass to IFilterInfo::FindPin
+ [propget]
+ HRESULT PinID(
+ [out, retval] BSTR* strPinID);
+
+ // collection of preferred media types (IAMCollection)
+ [propget]
+ HRESULT MediaTypes(
+ [out, retval] IDispatch** ppUnk);
+
+ // Connect to the following pin, using other transform
+ // filters as necessary. pPin can support either IPin or IPinInfo
+ HRESULT Connect(
+ [in] IUnknown* pPin);
+
+ // Connect directly to the following pin, not using any intermediate
+ // filters
+ HRESULT ConnectDirect(
+ [in] IUnknown* pPin);
+
+ // Connect directly to the following pin, using the specified
+ // media type only. pPin is an object that must support either
+ // IPin or IPinInfo, and pMediaType must support IMediaTypeInfo.
+ HRESULT ConnectWithType(
+ [in] IUnknown * pPin,
+ [in] IDispatch * pMediaType);
+
+ // disconnect this pin and the corresponding connected pin from
+ // each other. (Calls IPin::Disconnect on both pins).
+ HRESULT Disconnect(void);
+
+ // render this pin using any necessary transform and rendering filters
+ HRESULT Render(void);
+ }
+
+ //--------------------------------------------------------------------
+ //
+ // IAMStats - statistics
+ //
+ // Note that the calls using an index are likely to be much faster
+ //--------------------------------------------------------------------
+
+ [
+ uuid(bc9bcf80-dcd2-11d2-abf6-00a0c905f375),
+ helpstring("Statistics"),
+ odl,
+ oleautomation,
+ dual
+ ]
+ interface IAMStats : IDispatch {
+ // Reset all stats
+ HRESULT Reset();
+
+ // Get number of stats collected
+ [propget]
+ HRESULT Count(
+ [out, retval] LONG* plCount);
+
+ // Pull out a specific value by position
+ HRESULT GetValueByIndex([in] long lIndex,
+ [out] BSTR *szName,
+ [out] long *lCount,
+ [out] double *dLast,
+ [out] double *dAverage,
+ [out] double *dStdDev,
+ [out] double *dMin,
+ [out] double *dMax);
+
+ // Pull out a specific value by name
+ HRESULT GetValueByName([in] BSTR szName,
+ [out] long *lIndex,
+ [out] long *lCount,
+ [out] double *dLast,
+ [out] double *dAverage,
+ [out] double *dStdDev,
+ [out] double *dMin,
+ [out] double *dMax);
+
+
+ // The calls below are for generators of statistics
+
+ // Return the index for a string - optinally create
+ HRESULT GetIndex([in] BSTR szName,
+ [in] long lCreate,
+ [out] long *plIndex);
+
+ // Add a new value
+ HRESULT AddValue([in] long lIndex,
+ [in] double dValue);
+ }
+};
diff --git a/dxsdk/Include/DShowIDL/ddstream.idl b/dxsdk/Include/DShowIDL/ddstream.idl
new file mode 100644
index 00000000..30fa0475
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/ddstream.idl
@@ -0,0 +1,86 @@
+//------------------------------------------------------------------------------
+// File: DDStream.idl
+//
+// Desc: Used by MIDL tool to generate ddstream.h
+//
+// Copyright (c) 1998-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+import "mmstream.idl";
+
+cpp_quote("//")
+cpp_quote("// The following declarations within the 'if 0' block are dummy typedefs used to make")
+cpp_quote("// the ddstream.idl file build. The actual definitions are contained in DDRAW.H")
+cpp_quote("//")
+cpp_quote("#if 0")
+typedef void * LPDDSURFACEDESC;
+typedef struct tDDSURFACEDESC DDSURFACEDESC;
+cpp_quote("#endif")
+cpp_quote("#include <ddraw.h>")
+
+enum {
+ DDSFF_PROGRESSIVERENDER = 0x00000001
+};
+
+interface IDirectDraw;
+interface IDirectDrawSurface;
+interface IDirectDrawPalette;
+
+interface IDirectDrawMediaStream;
+interface IDirectDrawStreamSample;
+
+// IDirectDrawMediaStream
+[
+object,
+local,
+uuid(F4104FCE-9A70-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IDirectDrawMediaStream : IMediaStream
+{
+ HRESULT GetFormat(
+ [out] DDSURFACEDESC *pDDSDCurrent,
+ [out] IDirectDrawPalette **ppDirectDrawPalette,
+ [out] DDSURFACEDESC *pDDSDDesired,
+ [out] DWORD *pdwFlags);
+
+ HRESULT SetFormat(
+ [in] const DDSURFACEDESC *pDDSurfaceDesc,
+ [in] IDirectDrawPalette *pDirectDrawPalette);
+
+ HRESULT GetDirectDraw(
+ [out] IDirectDraw **ppDirectDraw);
+
+ HRESULT SetDirectDraw(
+ [in] IDirectDraw *pDirectDraw);
+
+ HRESULT CreateSample(
+ [in] IDirectDrawSurface *pSurface,
+ [in] const RECT *pRect,
+ [in] DWORD dwFlags,
+ [out]IDirectDrawStreamSample **ppSample);
+
+ HRESULT GetTimePerFrame(
+ [out] STREAM_TIME *pFrameTime);
+};
+
+
+// IDirectDrawStreamSample
+[
+object,
+local,
+uuid(F4104FCF-9A70-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IDirectDrawStreamSample : IStreamSample
+{
+ HRESULT GetSurface(
+ [out] IDirectDrawSurface ** ppDirectDrawSurface,
+ [out] RECT * pRect);
+
+ HRESULT SetRect(
+ [in] const RECT * pRect);
+
+};
diff --git a/dxsdk/Include/DShowIDL/devenum.idl b/dxsdk/Include/DShowIDL/devenum.idl
new file mode 100644
index 00000000..257193f4
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/devenum.idl
@@ -0,0 +1,38 @@
+//------------------------------------------------------------------------------
+// File: DevEnum.idl
+//
+// Desc: IDL source for devenum.dll. This file will be processed by the
+// MIDL tool to produce the type library (devenum.tlb) and marshalling
+// code.
+//
+// Copyright (c) 1998 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+cpp_quote("#define CDEF_CLASS_DEFAULT 0x0001")
+cpp_quote("#define CDEF_BYPASS_CLASS_MANAGER 0x0002")
+//cpp_quote("#define CDEF_CLASS_LEGACY 0x0004")
+cpp_quote("#define CDEF_MERIT_ABOVE_DO_NOT_USE 0x0008")
+
+// if any of these flags are set, then only the types specified by the
+// flags are enumerated
+cpp_quote("#define CDEF_DEVMON_CMGR_DEVICE 0x0010")
+cpp_quote("#define CDEF_DEVMON_DMO 0x0020")
+cpp_quote("#define CDEF_DEVMON_PNP_DEVICE 0x0040")
+cpp_quote("#define CDEF_DEVMON_FILTER 0x0080")
+cpp_quote("#define CDEF_DEVMON_SELECTIVE_MASK 0x00f0")
+
+[
+ object,
+ uuid(29840822-5B84-11D0-BD3B-00A0C911CE86),
+ pointer_default(unique)
+]
+interface ICreateDevEnum : IUnknown
+{
+ import "oaidl.idl";
+
+ HRESULT CreateClassEnumerator(
+ [in] REFCLSID clsidDeviceClass,
+ [out] IEnumMoniker ** ppEnumMoniker,
+ [in] DWORD dwFlags);
+}
diff --git a/dxsdk/Include/DShowIDL/dmodshow.idl b/dxsdk/Include/DShowIDL/dmodshow.idl
new file mode 100644
index 00000000..246f5ae6
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/dmodshow.idl
@@ -0,0 +1,33 @@
+//------------------------------------------------------------------------------
+// File: DMODShow.idl
+//
+// Desc: This file will be processed by the MIDL tool to
+// produce dmodshow.h and proxy-stub code.
+//
+// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+import "objidl.idl";
+import "mediaobj.idl";
+
+// 94297043-bd82-4dfd-b0de-8177739c6d20
+cpp_quote("DEFINE_GUID(CLSID_DMOWrapperFilter, 0x94297043,0xbd82,0x4dfd,0xb0,0xde,0x81,0x77,0x73,0x9c,0x6d,0x20);")
+// bcd5796c-bd52-4d30-ab76-70f975b89199
+cpp_quote("DEFINE_GUID(CLSID_DMOFilterCategory,0xbcd5796c,0xbd52,0x4d30,0xab,0x76,0x70,0xf9,0x75,0xb8,0x91,0x99);")
+
+
+[
+ object,
+ uuid(52d6f586-9f0f-4824-8fc8-e32ca04930c2),
+]
+interface IDMOWrapperFilter : IUnknown
+{
+ // Init is passed in the clsid (so it can call CoCreateInstance)
+ // and the catgory under which the DMO lives.
+ // Note that catDMO can be CLSID_NULL, in which case no special
+ // category-specific processing will be invoked in the wrapper filter.
+ HRESULT Init(REFCLSID clsidDMO, REFCLSID catDMO);
+}
+
diff --git a/dxsdk/Include/DShowIDL/dshowasf.idl b/dxsdk/Include/DShowIDL/dshowasf.idl
new file mode 100644
index 00000000..8add5111
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/dshowasf.idl
@@ -0,0 +1,59 @@
+//------------------------------------------------------------------------------
+// File: DShowASF.idl
+//
+// Desc:
+//
+// Copyright (c) 1992-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+import "objidl.idl";
+import "strmif.idl"; // for media type and time definitions
+import "wmsdkidl.idl";
+
+cpp_quote( "EXTERN_GUID( IID_IConfigAsfWriter,0x45086030,0xF7E4,0x486a,0xB5,0x04,0x82,0x6B,0xB5,0x79,0x2A,0x3B );" )
+
+interface IConfigAsfWriter;
+interface IWMProfile;
+
+// Interface to control the ASF writer
+[
+object,
+uuid(45086030-F7E4-486a-B504-826BB5792A3B),
+pointer_default(unique)
+]
+interface IConfigAsfWriter : IUnknown
+{
+ //
+ // The user is expected to enumerate profiles using the wmsdk IWMProfileManager
+ // method and then pass the desired profile index to the ASF Writer filter via this
+ // method. The filter will then try to configure itself for the selected profile.
+ //
+ // NOTE: These 2 XXXProfileId methods are now obsolete because they assume
+ // version 4.0 WMSDK profiles. To configure the filter for later profile
+ // versions using a profile index, use the XXXProfile methods which take
+ // the IWMProfile* directly.
+ //
+ HRESULT ConfigureFilterUsingProfileId([in] DWORD dwProfileId);
+ HRESULT GetCurrentProfileId([out] DWORD *pdwProfileId);
+
+ //
+ // configure using a pre-defined wmsdk profile guid
+ //
+ HRESULT ConfigureFilterUsingProfileGuid([in] REFGUID guidProfile);
+ HRESULT GetCurrentProfileGuid([out] GUID *pProfileGuid);
+
+ //
+ // Use these methods when a custom profile setup is preferred
+ //
+ HRESULT ConfigureFilterUsingProfile([in] IWMProfile * pProfile);
+ HRESULT GetCurrentProfile([out] IWMProfile **ppProfile);
+
+ //
+ // allow app to control whether or not to index file
+ //
+ HRESULT SetIndexMode( [in] BOOL bIndexFile );
+ HRESULT GetIndexMode( [out] BOOL *pbIndexFile );
+}
+
diff --git a/dxsdk/Include/DShowIDL/dvdif.idl b/dxsdk/Include/DShowIDL/dvdif.idl
new file mode 100644
index 00000000..4ad2bca1
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/dvdif.idl
@@ -0,0 +1,2326 @@
+//------------------------------------------------------------------------------
+// File: DVDIf.idl
+//
+// Desc: DirectShow interfaces to control playback of a DVD filter graph.
+//
+// Copyright (c) 1992-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+// forward declarations - these are the interfaces declared in this file
+
+import "unknwn.idl";
+import "objidl.idl";
+
+cpp_quote("#include <ddraw.h>")
+
+interface IDvdControl;
+interface IDvdInfo;
+interface IDirectDraw;
+interface IDirectDrawSurface;
+interface IDvdGraphBuilder ;
+interface IDDrawExclModeVideo;
+interface IDDrawExclModeVideoCallback;
+interface IDvdCmd;
+interface IDvdState;
+
+
+//==========================================================================
+//==========================================================================
+//
+// typedefs used by IDvdControl and IDvdInfo interfaces.
+//
+//==========================================================================
+//==========================================================================
+
+typedef enum tagDVD_DOMAIN {
+ // The DVD_DOMAIN is used to indicate the stat of a DVD player.
+ DVD_DOMAIN_FirstPlay=1, // doing default initialization of a dvd disc
+ DVD_DOMAIN_VideoManagerMenu, // displaying menus for whole disc
+ DVD_DOMAIN_VideoTitleSetMenu, // displaying menus for current title set
+ DVD_DOMAIN_Title, // displaying current title
+ DVD_DOMAIN_Stop // player is in stopped state
+} DVD_DOMAIN;
+
+typedef enum tagDVD_MENU_ID {
+ DVD_MENU_Title = 2, // to choose a title from any VTS in a DVD-Video volume
+ DVD_MENU_Root = 3, // main menu for a specific VTS
+ DVD_MENU_Subpicture =4, // to choose subpicture stream in a VTS
+ DVD_MENU_Audio = 5, // to choose audio stream in a VTS
+ DVD_MENU_Angle = 6, // to choose angle num in a VTS
+ DVD_MENU_Chapter = 7 // to choose a chapter in a VTS
+ // the Root menu always provides a means of getting to to Subpicture, Audio,
+ // Angle and Chapter menus if they exist.
+} DVD_MENU_ID;
+
+typedef enum tagDVD_DISC_SIDE {
+ DVD_SIDE_A = 1,
+ DVD_SIDE_B = 2
+} DVD_DISC_SIDE;
+
+
+typedef enum tagDVD_PREFERRED_DISPLAY_MODE
+{
+ // DVD_PREFERRED_DISPLAY_MODE is used to indicate the user's
+ // preferred window aspect ratio and preferred method of converion of
+ // 16*9 content to a 4*3 window aspect ratio. Pan-scan and letterboxing are
+ // the two conversion methods. This enum is used to indicate only a preference of
+ // conversion mechinism since some content can only be converted using one
+ // of these methods. 4*3 content is converted to a 16*9 window always by using
+ // "reverse" letterboxing where black bars are added to the right and left
+ // sides of the display instead of the top and bottom of the display as in the 16*9
+ // to 4*3 conversion useing letterboxing.
+ DISPLAY_CONTENT_DEFAULT = 0, // default to content
+ DISPLAY_16x9 = 1, // 16x9 display
+ DISPLAY_4x3_PANSCAN_PREFERRED = 2, // 4x3 display with pan-scan preferrence
+ DISPLAY_4x3_LETTERBOX_PREFERRED = 3 // 4x3 display with letterbox preferrence
+
+} DVD_PREFERRED_DISPLAY_MODE;
+
+typedef WORD DVD_REGISTER;
+typedef DVD_REGISTER GPRMARRAY[16]; // DVD-Video 1.0 has 16 16-bit General Parameter Registers
+typedef DVD_REGISTER SPRMARRAY[24]; // DVD-Video 1.0 has 24 16-bit System Parameter Registers
+
+
+
+// these are only for IDVDInfo1 compatibility and require the DVD-Video 1.0 specification
+// Please use the IDVDInfo2's DVD_Title/MenuAttributes, DVD_VideoAttributes, DVD_AudioAttributes, and DVD_SubpictureAttributes
+typedef struct tagDVD_ATR
+{
+ //
+ // Refer to the DVD-Video 1.0 spec to parse these structures.
+ //
+ ULONG ulCAT; // VMG_CAT if this is for a volume; or VTS_CAT
+ // if this is for a Video Title Set (VTS)
+ BYTE pbATRI[768];// All stream attributes for menu and title from bytes
+ // 256 to 1023 of VMGI or VTSI.
+} DVD_ATR;
+typedef BYTE DVD_VideoATR[2]; // video stream attributes.
+typedef BYTE DVD_AudioATR[8]; // audio stream attributes.
+typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes.
+
+// DVD1.0 Timecode is BCD encoded in this format: 0xHhMmSsFf, where
+// H is tens of hours
+// h is hours
+// M is tens of minutes
+// m is minutes
+// S is tens of seconds
+// s is seconds
+// F is tens of frames
+// f is frames
+// Note that you must know the frame rate to interperate the frame count as time.
+typedef enum tagDVD_FRAMERATE
+{
+ DVD_FPS_25 =1, // 25 frames per second
+ DVD_FPS_30NonDrop = 3 // exactly 30 frames per second
+} DVD_FRAMERATE;
+
+cpp_quote("typedef struct tagDVD_TIMECODE")
+cpp_quote("{")
+cpp_quote(" ULONG Hours1 :4; // Hours")
+cpp_quote(" ULONG Hours10 :4; // Tens of Hours ")
+cpp_quote("")
+cpp_quote(" ULONG Minutes1 :4; // Minutes ")
+cpp_quote(" ULONG Minutes10:4; // Tens of Minutes ")
+cpp_quote("")
+cpp_quote(" ULONG Seconds1 :4; // Seconds ")
+cpp_quote(" ULONG Seconds10:4; // Tens of Seconds ")
+cpp_quote("")
+cpp_quote(" ULONG Frames1 :4; // Frames ")
+cpp_quote(" ULONG Frames10 :2; // Tens of Frames ")
+cpp_quote("")
+cpp_quote(" ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop")
+cpp_quote("} DVD_TIMECODE;")
+
+//
+// Newer IDVD2 methods can use the HMSF format instead
+// Call SetOption( DVD_HMSF_TimeCodeEvents, TRUE) to return EC_DVD_CURRENT_HMSF_TIME
+// instead of EC_DVD_CURRENT_TIME events
+//
+typedef enum tagDVD_TIMECODE_FLAGS
+{
+ DVD_TC_FLAG_25fps = 0x00000001, // 25 frames per second
+ DVD_TC_FLAG_30fps = 0x00000002, // 30 frames per second
+ DVD_TC_FLAG_DropFrame = 0x00000004, // 29.97 instead of 30 fps
+ DVD_TC_FLAG_Interpolated = 0x00000008, // timecode may be inaccurate
+ // remainder of bits are reserved and should not be read
+} DVD_TIMECODE_FLAGS;
+
+// this can be cast to/from a ULONG
+typedef struct tagDVD_HMSF_TIMECODE
+{
+ BYTE bHours;
+ BYTE bMinutes;
+ BYTE bSeconds;
+ BYTE bFrames;
+} DVD_HMSF_TIMECODE;
+
+typedef struct tagDVD_PLAYBACK_LOCATION2
+{
+ //
+ // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
+ // playback location for One_Sequential_PGC_Titles.
+ //
+ ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
+ ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
+ DVD_HMSF_TIMECODE TimeCode; // use DVD_TIMECODE for current playback time.
+ ULONG TimeCodeFlags; // union of DVD_TIMECODE_EVENT_FLAGS
+
+} DVD_PLAYBACK_LOCATION2;
+
+typedef struct tagDVD_PLAYBACK_LOCATION
+{
+ //
+ // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
+ // playback location for One_Sequential_PGC_Titles.
+ //
+ ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
+ ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
+ ULONG TimeCode; // use DVD_TIMECODE for current playback time. 0xffffffff if not Once_Sequential_PGC_Title
+
+} DVD_PLAYBACK_LOCATION;
+
+typedef DWORD VALID_UOP_SOMTHING_OR_OTHER;
+
+typedef enum {
+ //
+ // Annex J User Functions ---
+ //
+ UOP_FLAG_Play_Title_Or_AtTime = 0x00000001, // Title_Or_Time_Play
+ UOP_FLAG_Play_Chapter = 0x00000002, // Chapter_Search_Or_Play
+ UOP_FLAG_Play_Title = 0x00000004, // Title_Play
+ UOP_FLAG_Stop = 0x00000008, // Stop
+ UOP_FLAG_ReturnFromSubMenu = 0x00000010, // GoUp
+ UOP_FLAG_Play_Chapter_Or_AtTime = 0x00000020, // Time_Or_Chapter_Search
+ UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x00000040, // Prev_Or_Top_PG_Search
+ UOP_FLAG_PlayNext_Chapter = 0x00000080, // Next_PG_Search
+ UOP_FLAG_Play_Forwards = 0x00000100, // Forward_Scan
+ UOP_FLAG_Play_Backwards = 0x00000200, // Backward_Scan
+ UOP_FLAG_ShowMenu_Title = 0x00000400, // Title_Menu_Call
+ UOP_FLAG_ShowMenu_Root = 0x00000800, // Root_Menu_Call
+ UOP_FLAG_ShowMenu_SubPic = 0x00001000, // SubPic_Menu_Call
+ UOP_FLAG_ShowMenu_Audio = 0x00002000, // Audio_Menu_Call
+ UOP_FLAG_ShowMenu_Angle = 0x00004000, // Angle_Menu_Call
+ UOP_FLAG_ShowMenu_Chapter = 0x00008000, // Chapter_Menu_Call
+ UOP_FLAG_Resume = 0x00010000, // Resume
+ UOP_FLAG_Select_Or_Activate_Button = 0x00020000, // Button_Select_Or_Activate
+ UOP_FLAG_Still_Off = 0x00040000, // Still_Off
+ UOP_FLAG_Pause_On = 0x00080000, // Pause_On
+ UOP_FLAG_Select_Audio_Stream = 0x00100000, // Audio_Stream_Change
+ UOP_FLAG_Select_SubPic_Stream = 0x00200000, // SubPic_Stream_Change
+ UOP_FLAG_Select_Angle = 0x00400000, // Angle_Change
+ UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x00800000, // Karaoke_Audio_Pres_Mode_Change
+ UOP_FLAG_Select_Video_Mode_Preference = 0x01000000 // Video_Pres_Mode_Change
+} VALID_UOP_FLAG ;
+
+typedef enum {
+ DVD_CMD_FLAG_None = 0x00000000,
+ DVD_CMD_FLAG_Flush = 0x00000001,
+ DVD_CMD_FLAG_SendEvents = 0x00000002,
+ DVD_CMD_FLAG_Block = 0x00000004, // block end
+ DVD_CMD_FLAG_StartWhenRendered = 0x00000008, // command "start" when the first frame is rendered
+ DVD_CMD_FLAG_EndAfterRendered = 0x00000010, // command "ends" after the last frame is rendered
+} DVD_CMD_FLAGS;
+
+// For IDVDControl2::SetOption flags
+typedef enum {
+ DVD_ResetOnStop = 1, // default TRUE
+ DVD_NotifyParentalLevelChange = 2, // default FALSE
+ DVD_HMSF_TimeCodeEvents = 3, // default FALSE (send DVD_CURRENT_TIME events)
+ DVD_AudioDuringFFwdRew = 4 // default FALSE (or by reg)
+} DVD_OPTION_FLAG;
+
+typedef enum {
+ DVD_Relative_Upper = 1,
+ DVD_Relative_Lower = 2,
+ DVD_Relative_Left = 3,
+ DVD_Relative_Right = 4
+} DVD_RELATIVE_BUTTON;
+
+// Parental Level Information
+typedef enum tagDVD_PARENTAL_LEVEL
+{
+ DVD_PARENTAL_LEVEL_8 = 0x8000,
+ DVD_PARENTAL_LEVEL_7 = 0x4000,
+ DVD_PARENTAL_LEVEL_6 = 0x2000,
+ DVD_PARENTAL_LEVEL_5 = 0x1000,
+ DVD_PARENTAL_LEVEL_4 = 0x0800,
+ DVD_PARENTAL_LEVEL_3 = 0x0400,
+ DVD_PARENTAL_LEVEL_2 = 0x0200,
+ DVD_PARENTAL_LEVEL_1 = 0x0100
+} DVD_PARENTAL_LEVEL;
+
+
+typedef enum tagDVD_AUDIO_LANG_EXT
+{
+ DVD_AUD_EXT_NotSpecified =0,
+ DVD_AUD_EXT_Captions =1,
+ DVD_AUD_EXT_VisuallyImpaired =2,
+ DVD_AUD_EXT_DirectorComments1 =3,
+ DVD_AUD_EXT_DirectorComments2 =4,
+} DVD_AUDIO_LANG_EXT;
+
+typedef enum tagDVD_SUBPICTURE_LANG_EXT
+{
+ DVD_SP_EXT_NotSpecified =0,
+ DVD_SP_EXT_Caption_Normal =1,
+ DVD_SP_EXT_Caption_Big =2,
+ DVD_SP_EXT_Caption_Children =3,
+ DVD_SP_EXT_CC_Normal =5,
+ DVD_SP_EXT_CC_Big =6,
+ DVD_SP_EXT_CC_Children =7,
+ DVD_SP_EXT_Forced =9,
+ DVD_SP_EXT_DirectorComments_Normal =13,
+ DVD_SP_EXT_DirectorComments_Big =14,
+ DVD_SP_EXT_DirectorComments_Children =15,
+} DVD_SUBPICTURE_LANG_EXT;
+
+typedef enum tagDVD_AUDIO_APPMODE
+{
+ DVD_AudioMode_None = 0, // no special mode
+ DVD_AudioMode_Karaoke = 1,
+ DVD_AudioMode_Surround = 2,
+ DVD_AudioMode_Other = 3,
+} DVD_AUDIO_APPMODE;
+
+typedef enum tagDVD_AUDIO_FORMAT
+{
+ DVD_AudioFormat_AC3 = 0,
+ DVD_AudioFormat_MPEG1 = 1,
+ DVD_AudioFormat_MPEG1_DRC = 2, // MPEG1 with dynamic range control
+ DVD_AudioFormat_MPEG2 = 3,
+ DVD_AudioFormat_MPEG2_DRC = 4, // MPEG2 with dynamic range control
+ DVD_AudioFormat_LPCM = 5,
+ DVD_AudioFormat_DTS = 6,
+ DVD_AudioFormat_SDDS = 7,
+ DVD_AudioFormat_Other = 8
+} DVD_AUDIO_FORMAT;
+
+// flags for SelectKaraokeAudioPresentationMode
+typedef enum tagDVD_KARAOKE_DOWNMIX
+{
+ DVD_Mix_0to0 = 0x0001, // unused - reserved for future use
+ DVD_Mix_1to0 = 0x0002, // unused - reserved for future use
+ DVD_Mix_2to0 = 0x0004,
+ DVD_Mix_3to0 = 0x0008,
+ DVD_Mix_4to0 = 0x0010,
+ DVD_Mix_Lto0 = 0x0020, // mix auxillary L to channel 0 (left speaker)
+ DVD_Mix_Rto0 = 0x0040, // mix auxillary R to channel 0 (left speaker)
+
+ DVD_Mix_0to1 = 0x0100, // unused - reserved for future use
+ DVD_Mix_1to1 = 0x0200, // unused - reserved for future use
+ DVD_Mix_2to1 = 0x0400,
+ DVD_Mix_3to1 = 0x0800,
+ DVD_Mix_4to1 = 0x1000,
+ DVD_Mix_Lto1 = 0x2000, // mix auxillary L to channel 1 (right speaker)
+ DVD_Mix_Rto1 = 0x4000, // mix auxillary R to channel 1 (right speaker)
+} DVD_KARAOKE_DOWNMIX;
+
+
+typedef struct tagDVD_AudioAttributes
+{
+ DVD_AUDIO_APPMODE AppMode;
+ BYTE AppModeData;
+ DVD_AUDIO_FORMAT AudioFormat; // Use GetKaraokeAttributes()
+ LCID Language; // 0 if no language is present
+ DVD_AUDIO_LANG_EXT LanguageExtension; // (captions, if for children etc)
+ BOOL fHasMultichannelInfo; // multichannel attributes are present (Use GetMultiChannelAudioAttributes())
+ DWORD dwFrequency; // in hertz (48k, 96k)
+ BYTE bQuantization; // resolution (16, 20, 24 bits etc), 0 is unknown
+ BYTE bNumberOfChannels; // 5.1 AC3 has 6 channels
+ DWORD dwReserved[2];
+} DVD_AudioAttributes;
+
+typedef struct tagDVD_MUA_MixingInfo
+{
+ // surround sound mixing information applied when:
+ // AppMode = DVD_AudioMode_Surround
+ // AudioFormat = DVD_AudioFormat_LPCM,
+ // fHasMultichannelInfo=1 modes are all on
+ //
+ BOOL fMixTo0;
+ BOOL fMixTo1;
+
+ //
+ BOOL fMix0InPhase;
+ BOOL fMix1InPhase;
+
+ DWORD dwSpeakerPosition; // see ksmedia.h: SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, etc
+} DVD_MUA_MixingInfo;
+
+// The alpha coeff is used to mix to ACH0 and beta is used to mix to ACH1
+//
+// In general:
+// ACH0 = coeff[0].alpha * value[0] + coeff[1].alpha * value[1] + ...
+// ACH1 = coeff[0].beta * value[0] + coeff[1].beta * value[1] + ...
+typedef struct tagDVD_MUA_Coeff
+{
+ double log2_alpha; // actual coeff = 2^alpha
+ double log2_beta; // actual coeff = 2^beta
+} DVD_MUA_Coeff;
+
+typedef struct tagDVD_MultichannelAudioAttributes
+{
+ // actual Data for each data stream
+ DVD_MUA_MixingInfo Info[8];
+ DVD_MUA_Coeff Coeff[8];
+} DVD_MultichannelAudioAttributes;
+
+// bitwise OR of these flags descript the contents of each channel
+typedef enum tagDVD_KARAOKE_CONTENTS
+{
+ DVD_Karaoke_GuideVocal1 = 0x0001,
+ DVD_Karaoke_GuideVocal2 = 0x0002,
+ DVD_Karaoke_GuideMelody1 = 0x0004,
+ DVD_Karaoke_GuideMelody2 = 0x0008,
+ DVD_Karaoke_GuideMelodyA = 0x0010,
+ DVD_Karaoke_GuideMelodyB = 0x0020,
+ DVD_Karaoke_SoundEffectA = 0x0040,
+ DVD_Karaoke_SoundEffectB = 0x0080
+} DVD_KARAOKE_CONTENTS;
+
+typedef enum tagDVD_KARAOKE_ASSIGNMENT
+{
+ DVD_Assignment_reserved0 = 0,
+ DVD_Assignment_reserved1 = 1,
+ DVD_Assignment_LR = 2, // left right
+ DVD_Assignment_LRM = 3, // left right middle
+ DVD_Assignment_LR1 = 4, // left right audio1
+ DVD_Assignment_LRM1 = 5, // left right middle audio1
+ DVD_Assignment_LR12 = 6, // left right audio1 audio2
+ DVD_Assignment_LRM12 = 7 // left right middle audio1 audio2
+} DVD_KARAOKE_ASSIGNMENT;
+
+typedef struct tagDVD_KaraokeAttributes
+{
+ BYTE bVersion;
+ BOOL fMasterOfCeremoniesInGuideVocal1;
+ BOOL fDuet; // false = solo
+ DVD_KARAOKE_ASSIGNMENT ChannelAssignment;
+ WORD wChannelContents[8]; // logical OR of DVD_KARAOKE_CONTENTS
+} DVD_KaraokeAttributes;
+
+typedef enum tagDVD_VIDEO_COMPRESSION
+{
+ DVD_VideoCompression_Other = 0,
+ DVD_VideoCompression_MPEG1 = 1,
+ DVD_VideoCompression_MPEG2 = 2,
+} DVD_VIDEO_COMPRESSION;
+
+typedef struct tagDVD_VideoAttributes
+{
+ BOOL fPanscanPermitted; // if a 4x3 display, can be shown as PanScan
+ BOOL fLetterboxPermitted; // if a 4x3 display, can be shown as Letterbox
+ ULONG ulAspectX; // 4x3 or 16x9
+ ULONG ulAspectY;
+ ULONG ulFrameRate; // 50hz or 60hz
+ ULONG ulFrameHeight; // 525 (60hz) or 625 (50hz)
+ DVD_VIDEO_COMPRESSION Compression;// MPEG1 or MPEG2
+
+ BOOL fLine21Field1InGOP; // true if there is user data in field 1 of GOP of video stream
+ BOOL fLine21Field2InGOP; // true if there is user data in field 1 of GOP of video stream
+
+ ULONG ulSourceResolutionX; // X source resolution (352,704, or 720)
+ ULONG ulSourceResolutionY; // Y source resolution (240,480, 288 or 576)
+
+ BOOL fIsSourceLetterboxed; // subpictures and highlights (e.g. subtitles or menu buttons) are only
+ // displayed in the active video area and cannot be displayed in the top/bottom 'black' bars
+ BOOL fIsFilmMode; // for 625/50hz systems, is film mode (true) or camera mode (false)
+} DVD_VideoAttributes;
+
+typedef enum tagDVD_SUBPICTURE_TYPE
+{
+ DVD_SPType_NotSpecified = 0,
+ DVD_SPType_Language = 1,
+ DVD_SPType_Other = 2,
+} DVD_SUBPICTURE_TYPE;
+
+typedef enum tagDVD_SUBPICTURE_CODING
+{
+ DVD_SPCoding_RunLength = 0,
+ DVD_SPCoding_Extended = 1,
+ DVD_SPCoding_Other = 2,
+} DVD_SUBPICTURE_CODING;
+
+typedef struct tagDVD_SubpictureAttributes
+{
+ DVD_SUBPICTURE_TYPE Type;
+ DVD_SUBPICTURE_CODING CodingMode;
+ LCID Language;
+ DVD_SUBPICTURE_LANG_EXT LanguageExtension;
+} DVD_SubpictureAttributes;
+
+typedef enum tagDVD_TITLE_APPMODE
+{
+ DVD_AppMode_Not_Specified = 0, // no special mode
+ DVD_AppMode_Karaoke = 1,
+ DVD_AppMode_Other = 3,
+} DVD_TITLE_APPMODE;
+
+typedef struct tagDVD_TitleMainAttributes
+{
+ // for Titles
+ DVD_TITLE_APPMODE AppMode;
+
+ // Attributes about the 'main' video of the menu or title
+ DVD_VideoAttributes VideoAttributes;
+
+ ULONG ulNumberOfAudioStreams;
+ DVD_AudioAttributes AudioAttributes[8];
+ // present if the multichannel bit is set in the corresponding stream's audio attributes
+ DVD_MultichannelAudioAttributes MultichannelAudioAttributes[8];
+
+ ULONG ulNumberOfSubpictureStreams;
+ DVD_SubpictureAttributes SubpictureAttributes[32];
+} DVD_TitleAttributes;
+
+typedef struct tagDVD_MenuAttributes
+{
+ // for VMG only
+ BOOL fCompatibleRegion[8]; // indeces 0..7 correspond to regions 1..8
+
+ // Attributes about the main menu (VMGM or VTSM)
+ DVD_VideoAttributes VideoAttributes;
+
+ BOOL fAudioPresent;
+ DVD_AudioAttributes AudioAttributes;
+
+ BOOL fSubpicturePresent;
+ DVD_SubpictureAttributes SubpictureAttributes;
+} DVD_MenuAttributes;
+
+//==========================================================================
+//==========================================================================
+// IDvdControl interface -- Basic DVD-Video playback control.
+// This modeled after the app control of a player specified in Annex J
+// of the DVD Video spec. IDvdInfo can be used to get information useful
+// in using IDvdControl
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(A70EFE61-E2A3-11d0-A9BE-00AA0061BE93),
+pointer_default(unique)
+]
+
+interface IDvdControl : IUnknown {
+ import "unknwn.idl";
+
+ // TitlePlay
+ // Start playing the specified title number.
+ // Title numbers range between 1 and 99.
+ HRESULT TitlePlay
+ ( [in] ULONG ulTitle
+ );
+
+ // ChapterPlay
+ // Start playing at the specified chapter (or part-of-title)
+ // within the specified title. Chapters range from 1 to 999.
+ HRESULT ChapterPlay
+ ( [in] ULONG ulTitle,
+ [in] ULONG ulChapter
+ );
+
+ // TimePlay
+ // Start playing at the specified time within the specified title.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ HRESULT TimePlay
+ ( [in] ULONG ulTitle,
+ [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
+ );
+
+ // StopForResume
+ // Stop playback after saving resume information. DVD Navigator transfers to the DVD "Stop State" and
+ // (same as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
+ HRESULT StopForResume();
+
+ // GoUp
+ // Start playback of the program chain currently authored as the "GoUp_PGCN".
+ HRESULT GoUp();
+
+ // TimeSearch
+ // Start playing at the specified time within the current title.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ HRESULT TimeSearch
+ ( [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
+ );
+
+ // ChapterSearch
+ // Start playing at the specified chapter (or part-of-title) within
+ // the current title.
+ HRESULT ChapterSearch
+ ( [in] ULONG ulChapter
+ );
+
+ // PrevPGSearch
+ // Start playing at the beginning of the previous DVD "program".
+ // For One-Sequential_PGC_Titles (which includes most titles) a program
+ // is equivalent to a chapter, otherwise a program is part of a chapter.
+ HRESULT PrevPGSearch();
+
+ // TopPGSearch
+ // Start playing from the beginning of they current program.
+ HRESULT TopPGSearch();
+
+ // NextPGSearch
+ // Start playing from the beginning of the next program.
+ HRESULT NextPGSearch();
+
+ // ForwardScan
+ // Set forward play at the specified speed.
+ // dwSpeed == 1 is normal play
+ // dwSpeed < 1 is slow play
+ // dwSpeed > 1 is fast play
+ // For dwSpeed != 1, audio and subpicture is muted.
+ HRESULT ForwardScan
+ ( [in] double dwSpeed
+ );
+
+ // BackwardScan
+ // Set reverse play at the specified speed.
+ // dwSpeed == 1 is normal play speed in reverse
+ // dwSpeed < 1 is slow play in reverse
+ // dwSpeed > 1 is fast play in reverse
+ // For reverse play, audio and subpicture are always muted.
+ HRESULT BackwardScan
+ ( [in] double dwSpeed
+ );
+
+ // MenuCall
+ // Start playback of the Menu specified by an enum DVD_MENU_ID.
+ HRESULT MenuCall
+ ( [in] DVD_MENU_ID MenuID
+ );
+
+ // Resume
+ // Returns to title playback in DVD_DOMAIN_Title. This is typically
+ // done after MenuCall which puts the DVD Navigator in
+ // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
+ HRESULT Resume();
+
+ // UpperButtonSelect
+ // Selects the button above the current button.
+ // "Selecting" a DVD button simply highlights the button but does
+ // not "Activate" the button. Selecting is the Windows equivalent
+ // to tabbing to a button but not pressing the space bar or enter key.
+ // Activating is the Windows equivalent of pressing the space bar or
+ // enter key after tabbing to a button.
+ HRESULT UpperButtonSelect();
+
+ // LowerButtonSelect
+ // Selects the button below the current button.
+ HRESULT LowerButtonSelect();
+
+ // LeftButtonSelect
+ // Selects the button to the left of the current button.
+ HRESULT LeftButtonSelect();
+
+ // RightButtonSelect
+ // Selects the button to the right of the current button.
+ HRESULT RightButtonSelect();
+
+ // ButtonActivate
+ // Activates current button.
+ HRESULT ButtonActivate();
+
+ // ButtonSelectAndActivate
+ // Selects and then activates the button specified by the user.
+ // ulButton is intended to be a number entered by a user corresponding
+ // to button numbers currently displayed on screen.
+ // Button numbers range from 1 to 36.
+ HRESULT ButtonSelectAndActivate
+ ( [in] ULONG ulButton
+ );
+
+ // StillOff
+ // Releases any current still if there are no available buttons.
+ // This includes VOBU stills, Cell stills, and PGC stills, whether the
+ // still is infinite. When buttons are available, stills are released by
+ // activating a button. Note this does not release a Pause.
+ HRESULT StillOff();
+
+ // PauseOn
+ // Freezes playback and any internal timers. This is similar to
+ // IMediaControl::Pause()
+ HRESULT PauseOn();
+
+ // PauseOff
+ // Releases a Pause.
+ HRESULT PauseOff();
+
+ // MenuLanguageSelect
+ // Selects the default language for menus. Languages are specified with
+ // Windows standard LCIDs. LCIDs can be created from ISO-639 codes with
+ // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT )
+ // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
+ // instead of 'ja' for the ISO639 code for Japanese.
+ // MenuLanguageSelect may only called from the DVD Stop state (DVD_DOMAIN_Stop).
+ HRESULT MenuLanguageSelect
+ ( [in] LCID Language
+ );
+
+ // AudioStreamChange
+ // Changes the current audio stream.
+ HRESULT AudioStreamChange
+ ( [in] ULONG ulAudio
+ );
+
+ // SubpictureStreamChange
+ // Changes the current subpicture stream number to nSubpic, and toggles
+ // its display.
+ HRESULT SubpictureStreamChange
+ ( [in] ULONG ulSubPicture,
+ [in] BOOL bDisplay
+ );
+
+ // AngleChange
+ // Changes the current angle number.
+ HRESULT AngleChange
+ ( [in] ULONG ulAngle
+ );
+
+ // ParentalLevelSelect
+ // Selects the current player parental level between 1 and 8. The
+ // defined parental levels are listed below :
+ //
+ // Level Rating
+ // ----- ------
+ //
+ // 1 G
+ // 3 PG
+ // 4 PG13
+ // 6 R
+ // 7 NC17
+ // Higher levels can play lower level content; lower levels cannot play
+ // higher level content. The DVD Navigator provides no restriction on
+ // setting the parental level. DVD player application may enforce
+ // restriction on parental level setting, such as password protection for
+ // raising the current parental level. Parental Management is disabled in
+ // the Navigator by default.
+ //
+ // Note : To disable parental management, pass 0xffffffff for ulParentalLevel
+ // If parental management is disabled, then the player will play the
+ // first PGC in a parental block regardless of parental IDs.
+ //
+ HRESULT ParentalLevelSelect
+ ( [in] ULONG ulParentalLevel
+ );
+
+ // ParentalCountrySelect
+ // Sets the country in which to interpret the the Parental Level.
+ // The country specified using the Alpha-2 code of the ISO-3166 standard,
+ // with the addition of 'ZZ'
+ HRESULT ParentalCountrySelect
+ ( [in] WORD wCountry
+ );
+
+ // KaraokeAudioPresentationModeChange
+ // Sets the Karaoke audio mode.
+ // NOTE: This and all other Karoke support is currently not implemented.
+ HRESULT KaraokeAudioPresentationModeChange
+ ( [in] ULONG ulMode
+ );
+
+ // VideoModePreferrence
+ // The user can specify the preferred display mode that should
+ // be used to display content. The parameter is a ULONG that has
+ // one of the values defined in DVD_PREFERRED_DISPLAY_MODE
+ HRESULT VideoModePreferrence
+ ( [in] ULONG ulPreferredDisplayMode
+ );
+
+ // SetRoot
+ // Sets the root directory containing the DVD-Video volume.
+ // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
+ // If the root directory is not successfully set before
+ // IMediaControl::Play is called, the first drive starting from c:
+ // containing a VIDEO_TS directory in the top level directory
+ // will be used as the root.
+ HRESULT SetRoot
+ ( [in] LPCWSTR pszPath
+ );
+
+ // MouseActivate
+ // This is typically called in response to a mouse click.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is first selected, then activated.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT MouseActivate // typically called after a mouse click
+ ( [in] POINT point
+ );
+
+ // MouseSelect
+ // This is typically called in response to a mouse move within the
+ // display window.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is selected.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT MouseSelect // typically called after a mouse move
+ ( [in] POINT point
+ );
+
+ // ChapterPlayAutoStop
+ // Start playing at the specified chapter within the specified title
+ // and play the number of chapters specified by the third parameter.
+ // Chapters range from 1 to 999.
+ HRESULT ChapterPlayAutoStop
+ ( [in] ULONG ulTitle, // title number
+ [in] ULONG ulChapter, // chapter number to start playback
+ [in] ULONG ulChaptersToPlay // number of chapters to play from the start chapter
+ );
+}
+
+
+
+//==========================================================================
+//==========================================================================
+// IDvdInfo interface -- allow an app to query for attributes of available
+// DVD titles and DVD player status. Also allow for control of a DVD
+// player beyond Annex J in the DVD spec.
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(A70EFE60-E2A3-11d0-A9BE-00AA0061BE93),
+pointer_default(unique)
+]
+
+interface IDvdInfo : IUnknown {
+ import "unknwn.idl";
+
+ // GetCurrentDomain
+ // Returns the current DVD Domain of the DVD player.
+ HRESULT GetCurrentDomain
+ ( [out] DVD_DOMAIN *pDomain
+ );
+
+ // GetCurrentLocation
+ // Returns information sufficient to restart playback of a video
+ // from the current playback location in titles that don't explicitly
+ // disable seeking to the current location.
+ HRESULT GetCurrentLocation
+ ( [out] DVD_PLAYBACK_LOCATION *pLocation
+ );
+
+ // GetTotalTitleTime
+ // Return the total playback time for the current title. Only works
+ // for One_Sequential_PGC_Titles.
+ HRESULT GetTotalTitleTime
+ ( [out] ULONG * pulTotalTime // use DVD_TIMECODE.
+ );
+
+ // GetCurrentButton
+ // Indicates the number of currently available buttons and the current
+ // selected button number. If buttons are not present it returns 0 for
+ // both pulButtonsAvailable and pulCurrentButton
+ HRESULT GetCurrentButton
+ ( [out] ULONG * pulButtonsAvailable,
+ [out] ULONG * pulCurrentButton
+ );
+
+ // GetCurrentAngle
+ // Indicates the number of currently available angles and the current
+ // selected angle number. If *pnAnglesAvailable==1, then the current
+ // video is not multiangle.
+ HRESULT GetCurrentAngle
+ ( [out] ULONG * pulAnglesAvailable,
+ [out] ULONG * pulCurrentAngle
+ );
+
+ // GetCurrentAudio
+ // Indicates the number of currently available audio streams and
+ // the current selected audio stream number.
+ // This only work when in DVD_DOMAIN_Title.
+ HRESULT GetCurrentAudio
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream
+ );
+
+ // GetCurrentSubpicture
+ // Indicates the number of currently available subpicture streams,
+ // the current selected subpicture stream number, and if the
+ // subpicture display is currently disabled. Subpicture streams
+ // authored as Forcedly Activated stream will be displayed even if
+ // subpicture display has been disabled by the app with
+ // IDVDControl::SubpictureChangeStream.
+ // This only work when in DVD_DOMAIN_Title.
+ HRESULT GetCurrentSubpicture
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream,
+ [out] BOOL * pIsDisabled
+ );
+
+ // GetCurrentUOPS
+ // Indicates which IDVDControl methods are currently valid. DVD titles
+ // can enable or disable individual user operations at almost any point
+ // during playback.
+ HRESULT GetCurrentUOPS
+ ( [out] VALID_UOP_SOMTHING_OR_OTHER * pUOP
+ );
+
+ // GetAllSPRMs
+ // Returns the current contents of all System Parameter Registers.
+ // See DVD-Video spec for use of individual registers.
+ HRESULT GetAllSPRMs
+ ( [out] SPRMARRAY * pRegisterArray
+ );
+
+ // GetAllGPRMs
+ // Returns the current contents of all General Parameter Registers.
+ // Use of GPRMs is title specific.
+ HRESULT GetAllGPRMs
+ ( [out] GPRMARRAY * pRegisterArray
+ );
+
+ // GetAudioLanguage
+ // Returns the language of the specified stream within the current
+ // title. Does not return languages for menus. Sets *pLanguage=0 if
+ // if the stream does not include language.
+ // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the result LCID.
+ HRESULT GetAudioLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetSubpictureLanguage
+ // Returns the language of the specified stream within the current
+ // title. Does not return languages for menus. Sets *pLanguage=0 if
+ // if the stream does not include language.
+ // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the result LCID.
+ HRESULT GetSubpictureLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetTitleAttributes
+ // Returns attributes of all video, audio, and subpicture
+ // streams for the specified title including menus.
+ // If nTitle == 0xffffffff, attributes for the current title are returned.
+ HRESULT GetTitleAttributes
+ ( [in] ULONG ulTitle, // requested title number
+ [out] DVD_ATR * pATR
+ );
+
+ // GetVMGAttributes
+ // Returns attributes of all video, audio, and subpicture
+ // streams for Video Manager Menus. Some menus, such as the DVD_MENU_Title
+ // are in a separate group of streams called the VMG (Video Manager) and
+ // are not associated with any particular title number.
+ HRESULT GetVMGAttributes
+ ( [out] DVD_ATR * pATR
+ );
+
+ // GetCurrentVideoAttributes
+ // Returns the video attributes for the current title or menu.
+ HRESULT GetCurrentVideoAttributes
+ ( [out] DVD_VideoATR *pATR
+ );
+
+ // GetCurrentAudioAttributes
+ // Returns the video attributes for the stream in the current
+ // title or menu.
+ HRESULT GetCurrentAudioAttributes
+ ( [out] DVD_AudioATR *pATR
+ );
+
+ // GetCurrentSubpictureAttributes
+ // Returns the video attributes for the stream in the current
+ // title or menu.
+ HRESULT GetCurrentSubpictureAttributes
+ ( [out] DVD_SubpictureATR *pATR
+ );
+
+
+ // GetCurrentVolumeInfo
+ // Returns current DVD volume info.
+ HRESULT GetCurrentVolumeInfo
+ ( [out] ULONG *pulNumOfVol, // number of volumes (disc sides?) in a volume set
+ [out] ULONG *pulThisVolNum, // volume number for this root directory
+ [out] DVD_DISC_SIDE *pSide, // current disc side
+ [out] ULONG *pulNumOfTitles // number of titles available in this volume
+ );
+
+
+ // GetDVDTextInfo
+ // Returns the TXTDT_MG structure, which can contain text descriptions for title
+ // name, volume name, producer name, vocalist name, etc. in various languages.
+ // refer to Section 4.1.6 and Annex A of the DVD-Video spec.
+ // If the buffer size passed in is insufficient (for example if cbBufSize==0),
+ // then E_OUTOFMEMORY is returned, and *pcbActualSize is set to the required size.
+ HRESULT GetDVDTextInfo
+ ( [out, size_is(ulBufSize)] BYTE *pTextManager,
+ [in] ULONG ulBufSize, // buffer size passed in
+ [out] ULONG *pulActualSize // amount of actual data return
+ );
+
+ // GetPlayerParentalLevel
+ // Returns the current parental level and the current country code
+ // that has been set in the system registers in player.
+ // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
+ // Valid Parental Levels = 1..8 if parental management is enabled
+ // 0xffffffff if parental management is disabled
+ // See ISO3166 : Alpha-2 Code for the country codes.
+ HRESULT GetPlayerParentalLevel
+ ( [out] ULONG *pulParentalLevel, // current parental level
+ [out] ULONG *pulCountryCode // current country code
+ );
+
+ // GetNumberOfChapters
+ // Returns the number of chapters that are defined for a
+ // given title.
+ HRESULT GetNumberOfChapters
+ ( [in] ULONG ulTitle, // Title for which number of chapters is requested
+ [out] ULONG *pulNumberOfChapters // Number of chapters for the specified title
+ );
+
+ // GetTitleParentalLevels
+ // Returns the parental levels that are defined for a
+ // particular title. pParentalLevels will be combination
+ // of DVD_PARENTAL_LEVEL_8, DVD_PARENTAL_LEVEL_6, or
+ // DVD_PARENTAL_LEVEL_1 "OR"ed together
+ HRESULT GetTitleParentalLevels
+ ( [in] ULONG ulTitle, // Title for which parental levels are requested
+ [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together
+ );
+
+ // GetRoot
+ // Returns the root directory that is set in the player. If a valid root
+ // has been found, it returns the root string. Otherwise, it returns 0 for
+ // pcbActualSize indicating that a valid root directory has not been found
+ // or initialized.
+ //
+ // !!! used to return LPTSTR. interface was changed to return
+ // LPSTR (ansi) for compatibility. COM APIs should pass with
+ // UNICODE strings only.
+ //
+ HRESULT GetRoot
+ ( [out, size_is(ulBufSize)] LPSTR pRoot, // pointer to buffer to get root string
+ [in] ULONG ulBufSize, // size of buffer passed in
+ [out] ULONG *pulActualSize // size of actual data returned
+ );
+}
+
+//==========================================================================
+//==========================================================================
+// IDvdCmd interface -- the IDVDControl2 command sequencing object.
+//
+// For the IDVDControl2 interface, the application can track the status of
+// commands that have been issued to the navigator. Each command is identified
+// by an IDvdCmd object. The IDvdCmd object stores the results of the command
+// at both the start (when the command has begun processing) and the end after
+// it has completed. It also allows the app to synchronize with the processing
+// of the command.
+//
+// The command object also allows the app to uniquely identify and correlate
+// completion events (if it prefers to process events in a message loop instead
+// of creating another process).
+//
+// Allows the app to track the status of an issued command to the nav.
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(5a4a97e4-94ee-4a55-9751-74b5643aa27d),
+pointer_default(unique)
+]
+
+interface IDvdCmd : IUnknown {
+ import "unknwn.idl";
+
+ //
+ // WaitForStart
+ //
+ // Blocks the application until the command has begun.
+ //
+ HRESULT WaitForStart();
+
+ //
+ // WaitForEnd
+ //
+ // Blocks until the command has completed or has been cancelled.
+ HRESULT WaitForEnd();
+}
+
+//==========================================================================
+//==========================================================================
+// IDvdState interface -- the State state object.
+//
+// Whenever the application wishes to save or restore a location on the disc,
+// it needs to store the DVD state into an object.
+// The State object supports the IPersistStream
+//
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(86303d6d-1c4a-4087-ab42-f711167048ef),
+pointer_default(unique)
+]
+
+interface IDvdState : IUnknown
+{
+ //
+ // GetDiscID
+ //
+ // Returns the disc ID from which the bookmark was made.
+ //
+ HRESULT GetDiscID
+ ( [out] ULONGLONG* pullUniqueID ); // 64-bit unique id for the disc
+
+ //
+ // GetParentalLevel
+ //
+ // Returns the state's parental level
+ //
+ HRESULT GetParentalLevel
+ ( [out] ULONG* pulParentalLevel );
+}
+
+//==========================================================================
+//==========================================================================
+// IDvdControl2 interface -- Basic DVD-Video playback control.
+// This is modeled after the app control of a player specified in Annex J
+// of the DVD Video spec. IDvdInfo2 can be used to get information useful
+// in using IDvdControl2
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(33BC7430-EEC0-11D2-8201-00A0C9D74842),
+pointer_default(unique)
+]
+
+interface IDvdControl2 : IUnknown {
+ import "unknwn.idl";
+
+ // PlayTitle
+ //
+ // Start playing from the beginning of the specified title number.
+ // Annex J: Title_Play
+ // Title numbers range between 1 and 99.
+ HRESULT PlayTitle
+ ( [in] ULONG ulTitle,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayChapterInTitle
+ //
+ // Start playing from the beginning of the given chapter (or part-of-title) number
+ // within the specified title number.
+ // Annex J: PTT_Play
+ // Title numbers range between 1 and 99.
+ // Chapters range from 1 to 999.
+ HRESULT PlayChapterInTitle
+ ( [in] ULONG ulTitle,
+ [in] ULONG ulChapter,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayAtTimeInTitle
+ //
+ // Start playing from the specified time within the specified title number.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ // Annex J: Time_Play
+ // Title numbers range between 1 and 99.
+ HRESULT PlayAtTimeInTitle
+ ( [in] ULONG ulTitle,
+ [in] DVD_HMSF_TIMECODE* pStartTime,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // Stop
+ // Stop playback by transferring DVD Navigator to the DVD "Stop State" (same
+ // as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
+ // Annex J: Stop
+ HRESULT Stop();
+
+ // ReturnFromSubmenu
+ //
+ // Stop playback of current program chain (PGC) and start playing the PGC
+ // specified by "GoUp_PGCN".in the PGCI.
+ // If the GoUp_PGCN value is 0xFFFF the Resume() operation is carried out.
+ // Annex J: GoUp
+ HRESULT ReturnFromSubmenu(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // PlayAtTime
+ // Start playing at the specified time within the current title.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ // Annex J: Time_Search
+ // The time is in BCD format, passed in as a ULONG.
+ HRESULT PlayAtTime
+ ( [in] DVD_HMSF_TIMECODE* pTime,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayChapter
+ // Start playing at the specified chapter (or part-of-title) within
+ // the current title.
+ // Annex J: PTT_Search
+ // Chapters range from 1 to 999.
+ HRESULT PlayChapter
+ ( [in] ULONG ulChapter,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayPrevChapter
+ // Start playing at the beginning of the previous DVD "program".
+ // For One-Sequential_PGC_Titles (which includes most titles) a program
+ // is equivalent to a chapter, otherwise a program is part of a chapter.
+ // Annex J: PrevPG_Search
+ HRESULT PlayPrevChapter(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // ReplayChapter
+ // Start playing from the beginning of they current program.
+ // Annex J: TopPG_Search
+ HRESULT ReplayChapter(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // PlayNextChapter
+ // Start playing from the beginning of the next program.
+ // Annex J: NextPG_Search
+ HRESULT PlayNextChapter(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // PlayForwards
+ // Set forward play at the specified speed.
+ // Annex J: Forward_Scan
+ // dSpeed == 1 is normal play
+ // dSpeed < 1 is slow play
+ // dSpeed > 1 is fast play
+ // For dSpeed != 1, audio and subpicture is muted.
+ HRESULT PlayForwards
+ ( [in] double dSpeed,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayBackwards
+ // Set reverse play at the specified speed.
+ // Annex J: Backward_Scan
+ // dSpeed == 1 is normal play speed in reverse
+ // dSpeed < 1 is slow play in reverse
+ // dSpeed > 1 is fast play in reverse
+ // For reverse play, audio and subpicture are always muted.
+ HRESULT PlayBackwards
+ ( [in] double dSpeed,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // ShowMenu
+ // Start playback of the Menu specified by an enum DVD_MENU_ID.
+ // Annex J: Menu_Call
+ HRESULT ShowMenu
+ ( [in] DVD_MENU_ID MenuID,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // Resume
+ // Returns to title playback in DVD_DOMAIN_Title. This is typically
+ // done after MenuCall which puts the DVD Navigator in
+ // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
+ // Annex J: Resume
+ HRESULT Resume(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // SelectRelativeButton
+ // Moves the selection highlight above, below, to the left of, or to the right of the
+ // currently selected.
+ // "Selecting" a DVD button simply highlights the button but does
+ // not "Activate" the button. Selecting is the Windows equivalent
+ // to tabbing to a button but not pressing the space bar or enter key.
+ // Activating is the Windows equivalent of pressing the space bar or
+ // enter key after tabbing to a button.
+ // Annex J: Upper_button_Select, Lower_button_Select, Left_button_Select, Right_button_Select
+ HRESULT SelectRelativeButton( DVD_RELATIVE_BUTTON buttonDir );
+
+ // ActivateButton
+ // Activates current button.
+ // Annex J: Button_Activate
+ HRESULT ActivateButton();
+
+ // SelectButton
+ // Selects a specific button (with the index from 1 to 36).
+ // ulButton is intended to be a number entered by a user corresponding
+ // to button numbers currently displayed on screen.
+ // Button numbers range from 1 to 36.
+ HRESULT SelectButton
+ ( [in] ULONG ulButton
+ );
+
+ // SelectAndActivateButton
+ // Selects and then activates the button specified by the user.
+ // ulButton is intended to be a number entered by a user corresponding
+ // to button numbers currently displayed on screen.
+ // Annex J: Button_Select_And_Activate
+ // Button numbers range from 1 to 36.
+ HRESULT SelectAndActivateButton
+ ( [in] ULONG ulButton
+ );
+
+ // StillOff
+ // Releases any current still if there are no available buttons.
+ // This includes VOBU stills, Cell stills, and PGC stills, whether the
+ // still is infinite. When buttons are available, stills are released by
+ // activating a button. Note this does not release a Pause.
+ // Annex J: Still_Off
+ HRESULT StillOff();
+
+ // Pause
+ // Freezes / unfreezes playback and any internal timers. This is similar to
+ // IMediaControl::Pause(), but not the same in effect as IMediaControl::Pause
+ // puts the filter (all filters, if done to the graph) in paused state.
+ // Annex J: Pause_On and Pause_Off
+ // bState is TRUE or FALSE to indicate whether to do Puase_on/Pause_Off according
+ // to Annex J terminology.
+ HRESULT Pause
+ ( [in] BOOL bState
+ );
+
+ // SelectAudioStream
+ // Changes the current audio stream to ulAudio.
+ // Annex J: Audio_Stream_Change
+ // Audio stream number ranges between 0 and 7 or DEFAULT_AUDIO_STREAM (15 - default based on default language & language extension)
+ HRESULT SelectAudioStream
+ ( [in] ULONG ulAudio,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+
+ );
+
+ // SelectSubpictureStream
+ // Changes the current subpicture stream number to ulSubPicture
+ // Annex J: Sub-picture_Stream_Change (first param)
+ // Subpicture stream number should be between 0 and 31 or 63.
+ HRESULT SelectSubpictureStream
+ ( [in] ULONG ulSubPicture,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+
+ );
+
+ // SetSubpictureState
+ // Turns on/off current subpicture stream display.
+ // Annex J: Sub-picture_Stream_Change (second param)
+ // Subpicture state is On or Off (TRUE or FALSE)
+ HRESULT SetSubpictureState
+ ( [in] BOOL bState,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SelectAngle
+ // Changes the current angle number.
+ // Annex J: Angle_Change
+ // Angle number is between 1 and 9.
+ HRESULT SelectAngle
+ ( [in] ULONG ulAngle,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SelectParentalLevel
+ // Selects the current player parental level.
+ // Annex J: Parental_Level_Select
+ // Parental level ranges between 1 and 8.
+ // The defined parental levels are listed below :
+ //
+ // Level Rating
+ // ----- ------
+ // 1 G
+ // 3 PG
+ // 4 PG13
+ // 6 R
+ // 7 NC17
+ // Higher levels can play lower level content; lower levels cannot play
+ // higher level content. The DVD Navigator provides no restriction on
+ // setting the parental level. DVD player application may enforce
+ // restriction on parental level setting, such as password protection for
+ // raising the current parental level. Parental Management is disabled in
+ // the Navigator by default.
+ //
+ // Note : To disable parental management, pass 0xffffffff for ulParentalLevel
+ // If parental management is disabled, then the player will play the
+ // first PGC in a parental block regardless of parental IDs.
+ //
+ HRESULT SelectParentalLevel
+ ( [in] ULONG ulParentalLevel
+ );
+
+ // SelectParentalCountry
+ // Sets the country in which to interpret the Parental Level.
+ // Annex J: Parental_Country_Select
+ // The country specified using the Alpha-2 code of the ISO-3166 standard,
+ HRESULT SelectParentalCountry
+ ( [in] BYTE bCountry[2]
+ );
+
+ // SelectKaraokeAudioPresentationMode
+ // Sets the Karaoke audio mode.
+ // Annex J: Karaoke_Audio_Presentation_Mode_Change
+ // NOTE: This and all other Karoke support is currently not implemented.
+ // Mode represents the audio mixing mode for Karaoke (same info as SPRM11).
+ // Use a bitwise OR of the bits in DVD_KARAOKE_DOWNMIX
+ HRESULT SelectKaraokeAudioPresentationMode
+ ( [in] ULONG ulMode
+ );
+
+ // SelectVideoModePreference
+ // The user can specify the (initial) preferred display mode (aspect ratio)
+ // (wide / letterbox / pan-scan) that should be used to display content
+ // (16 : 9).
+ // Annex J: Video_Presentation_Mode_Change
+ // The parameter is a ULONG that has one of the values defined in
+ // DVD_PREFERRED_DISPLAY_MODE
+ HRESULT SelectVideoModePreference
+ ( [in] ULONG ulPreferredDisplayMode
+ );
+
+ // SetDVDDirectory
+ // Sets the root directory containing the DVD-Video volume.
+ // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
+ // If the root directory is not successfully set before
+ // IMediaControl::Play is called, the first drive starting from c:
+ // containing a VIDEO_TS directory in the top level directory
+ // will be used as the root.
+ HRESULT SetDVDDirectory
+ ( [in] LPCWSTR pszwPath
+ );
+
+ // ActivateAtPosition
+ // This is typically called in response to a mouse click.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is first selected, then activated.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT ActivateAtPosition // typically called after a mouse click
+ ( [in] POINT point
+ );
+
+ // SelectAtPosition
+ // This is typically called in response to a mouse move within the
+ // display window.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is selected.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT SelectAtPosition // typically called after a mouse move
+ ( [in] POINT point
+ );
+
+ // PlayChaptersAutoStop
+ // Start playing at the specified chapter within the specified title
+ // and play the number of chapters specified by the third parameter.
+ // Then the playback stops by sending an event EC_DVD_CHAPTER_AUTOSTOP.
+ // Title ranges from 1 to 99.
+ // Chapter (and number of chapters to play) ranges from 1 to 999.
+ HRESULT PlayChaptersAutoStop
+ ( [in] ULONG ulTitle, // title number
+ [in] ULONG ulChapter, // chapter number to start playback
+ [in] ULONG ulChaptersToPlay, // number of chapters to play from the start chapter
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // AcceptParentalLevelChange
+ //
+ // Application's way of informing the Navigator that the required parental
+ // level change indicated through a previous event was accepted or rejected
+ // by the app (and unblock the Navigator).
+ //
+ // FALSE - reject the disc's request to change the current parental level.
+ // TRUE - change the parental level as required by the disc.
+ HRESULT AcceptParentalLevelChange
+ ( [in] BOOL bAccept
+ );
+
+ // SetOption(flag, true/false )
+ // Flags:
+ //
+ // DVD_ResetOnStop
+ // Disable reset of the Navigator's internal state on the
+ // subsequent IMediaControl::Stop() call(s).
+ //
+ // FALSE - Navigator does not reset its state on the subsequent Stop calls
+ // (play from the current location on next Run call).
+ // TRUE - (default) Navigator resets its state on the subsequent Stop call
+ // (play from the first play PGC on the Run call after the Stop).
+ //
+ // DVD_NotifyParentalLevelChange
+ //
+ // Allows the application to indicate to the Navigator that it wants to control
+ // parent level change (e.g., through a dialog box) and indicate the acceptance
+ // or rejection of the new parental level to the Navigator through
+ // AcceptParentalLevelChange().
+ //
+ // FALSE - disable (default). Always reject request by the disc to change parental level.
+ // TRUE - enable. Navigator will send the app a 'EC_DVD_PARENTAL_LEVEL_CHANGE' event
+ // and block until AcceptParentalLevelChange() is called by the app.
+ //
+ // DVD_HMSF_TimeCodeEvents
+ //
+ // Lets the application specify to the Navigator if it wants to get the new time
+ // event EC_DVD_CURRENT_HMSF_TIME with the HMSF format rather than the older
+ // EC_DVD_CURRENT_TIME events.
+ //
+ // FALSE - disable (default). Older EC_DVD_CURRENT_TIME events are returned.
+ // TRUE - enable. Navigator will send the app EC_DVD_CURRENT_HMSF_TIME events.
+
+ HRESULT SetOption
+ ( [in] DVD_OPTION_FLAG flag,
+ [in] BOOL fState
+ );
+
+ // SetState
+ //
+ // The navigator will use the location information in the given state object to restore
+ // the navigator's position to a specific location on the disc.
+ // A valid state object is returned by either calling GetState(), or by using
+ // "CoCreateInstance( CLSID_DVDState, NULL, CLSCTX_INPROC_SERVER, IID_IDvdState, (void **) ppState )"
+ // to create a state object, followed by pState->IPersist::Load() to read it from memory or disk.
+ //
+ HRESULT SetState
+ ( [in] IDvdState* pState,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+
+ );
+
+ // PlayPeriodInTitleAutoStop
+ //
+ // Start playing from the specified time within the specified title number until the specified end time.
+ // NOTE: the actual start and end times will be the closest sync points before
+ // or equal to the specified frame number.
+ // Annex J: Time_Play for a limited range
+ // Title numbers range between 1 and 99.
+ HRESULT PlayPeriodInTitleAutoStop
+ ( [in] ULONG ulTitle,
+ [in] DVD_HMSF_TIMECODE* pStartTime,
+ [in] DVD_HMSF_TIMECODE* pEndTime,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SetGPRM
+ // Sets the current contents of a DVD General Parameter Register.
+ // Use of GPRMs is title specific.
+
+ HRESULT SetGPRM
+ ( [in] ULONG ulIndex,
+ [in] WORD wValue,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SelectDefaultMenuLanguage
+ // Selects the default language for menus.
+ // Languages are specified with Windows standard LCIDs. LCIDs can be created
+ // from ISO-639 codes with
+ // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT ).
+ // SelectMenuLanguage may only called from the DVD Stop state (DVD_DOMAIN_Stop).
+ // Annex J: Menu_Language_Select
+ //
+ // NOT TRUE ANYMORE:
+ // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
+ // instead of 'ja' for the ISO639 code for Japanese.
+ HRESULT SelectDefaultMenuLanguage
+ ( [in] LCID Language
+ );
+
+ // SelectDefaultAudioLanguage
+ // Selects the default audio language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT SelectDefaultAudioLanguage
+ ( [in] LCID Language,
+ [in] DVD_AUDIO_LANG_EXT audioExtension
+ );
+
+ // SelectDefaultSubpictureLanguage
+ // Selects the default subpicture language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT SelectDefaultSubpictureLanguage
+ ( [in] LCID Language,
+ [in] DVD_SUBPICTURE_LANG_EXT subpictureExtension
+ );
+}
+
+
+//==========================================================================
+//==========================================================================
+// IDvdInfo2 interface -- allows an app to query for attributes of available
+// DVD titles and DVD player status. Also allows for control of a DVD
+// player beyond Annex J in the DVD spec.
+//==========================================================================
+//==========================================================================
+
+enum DVD_TextStringType {
+ // disc structure (0x00..0x0f)
+ DVD_Struct_Volume = 0x01,
+ DVD_Struct_Title = 0x02,
+ DVD_Struct_ParentalID = 0x03,
+ DVD_Struct_PartOfTitle = 0x04,
+ DVD_Struct_Cell = 0x05,
+ // stream (0x10..0x1f)
+ DVD_Stream_Audio = 0x10,
+ DVD_Stream_Subpicture = 0x11,
+ DVD_Stream_Angle = 0x12,
+ // channel in stream (0x20..0x2f)
+ DVD_Channel_Audio = 0x20,
+
+ // Application information
+ // General (0x30..0x37)
+ DVD_General_Name = 0x30,
+ DVD_General_Comments = 0x31,
+
+ // Title (0x38..0x3f)
+ DVD_Title_Series = 0x38,
+ DVD_Title_Movie = 0x39,
+ DVD_Title_Video = 0x3a,
+ DVD_Title_Album = 0x3b,
+ DVD_Title_Song = 0x3c,
+ DVD_Title_Other = 0x3f,
+
+ // Title (sub) (0x40..0x47)
+ DVD_Title_Sub_Series = 0x40,
+ DVD_Title_Sub_Movie = 0x41,
+ DVD_Title_Sub_Video = 0x42,
+ DVD_Title_Sub_Album = 0x43,
+ DVD_Title_Sub_Song = 0x44,
+ DVD_Title_Sub_Other = 0x47,
+
+ // Title (original) (0x48..0x4f)
+ DVD_Title_Orig_Series = 0x48,
+ DVD_Title_Orig_Movie = 0x49,
+ DVD_Title_Orig_Video = 0x4a,
+ DVD_Title_Orig_Album = 0x4b,
+ DVD_Title_Orig_Song = 0x4c,
+ DVD_Title_Orig_Other = 0x4f,
+
+ // Other info (0x50..0x57)
+ DVD_Other_Scene = 0x50,
+ DVD_Other_Cut = 0x51,
+ DVD_Other_Take = 0x52,
+
+ // Language 0x58..0x5b
+ // Work 0x5c..0x6b
+ // Character 0x6c..0x8f
+ // Data 0x90..0x93
+ // Karaoke 0x94..0x9b
+ // Category 0x9c..0x9f
+ // Lyrics 0xa0..0xa3
+ // Document 0xa4..0xa7
+ // Others 0xa8..0xab
+ // Reserved 0xac..0xaf
+ // Admin 0xb0..0xb7
+ // more admin 0xb8..0xc0
+ // Reserved 0xd0..0xdf
+ // vendor 0xe0..0xef
+ // extension 0xf0..0xf7
+ // reserved 0xf8..0xff
+};
+
+enum DVD_TextCharSet {
+ DVD_CharSet_Unicode = 0,
+ DVD_CharSet_ISO646 = 1,
+ DVD_CharSet_JIS_Roman_Kanji = 2,
+ DVD_CharSet_ISO8859_1 = 3,
+ DVD_CharSet_ShiftJIS_Kanji_Roman_Katakana = 4
+};
+
+cpp_quote ("#define DVD_TITLE_MENU 0x000")
+cpp_quote ("#define DVD_STREAM_DATA_CURRENT 0x800")
+cpp_quote ("#define DVD_STREAM_DATA_VMGM 0x400")
+cpp_quote ("#define DVD_STREAM_DATA_VTSM 0x401")
+cpp_quote ("#define DVD_DEFAULT_AUDIO_STREAM 0x0f")
+
+// DVD Decoder Caps data
+typedef struct tagDVD_DECODER_CAPS
+{
+ DWORD dwSize ; // size of this struct
+ DWORD dwAudioCaps ; // bits indicating audio support (AC3, DTS, SDDS, LPCM etc.) of decoder
+ double dFwdMaxRateVideo ; // max data rate for video going forward
+ double dFwdMaxRateAudio ; // ... .. .. ... audio ... ...
+ double dFwdMaxRateSP ; // ... .. .. ... SP ... ...
+ double dBwdMaxRateVideo ; // if smooth reverse is not available, this will be set to 0
+ double dBwdMaxRateAudio ; // -- ditto --
+ double dBwdMaxRateSP ; // -- ditto --
+ DWORD dwRes1 ; // reserved for future expansion
+ DWORD dwRes2 ; // -- ditto --
+ DWORD dwRes3 ; // -- ditto --
+ DWORD dwRes4 ; // -- ditto --
+} DVD_DECODER_CAPS ;
+
+// Bits for decoder's audio format support
+cpp_quote ("#define DVD_AUDIO_CAPS_AC3 0x00000001")
+cpp_quote ("#define DVD_AUDIO_CAPS_MPEG2 0x00000002")
+cpp_quote ("#define DVD_AUDIO_CAPS_LPCM 0x00000004")
+cpp_quote ("#define DVD_AUDIO_CAPS_DTS 0x00000008")
+cpp_quote ("#define DVD_AUDIO_CAPS_SDDS 0x00000010")
+
+
+[
+object,
+uuid(34151510-EEC0-11D2-8201-00A0C9D74842),
+pointer_default(unique)
+]
+
+interface IDvdInfo2 : IUnknown {
+ import "unknwn.idl";
+
+ // GetCurrentDomain
+ // Returns the current DVD Domain of the DVD player.
+ HRESULT GetCurrentDomain
+ ( [out] DVD_DOMAIN *pDomain
+ );
+
+ // GetCurrentLocation
+ // Returns information sufficient to restart playback of a video
+ // from the current playback location in titles that don't explicitly
+ // disable seeking to the current location.
+ HRESULT GetCurrentLocation
+ ( [out] DVD_PLAYBACK_LOCATION2 *pLocation
+ );
+
+ // GetTotalTitleTime
+ // Returns the total playback time for the current title. Only works
+ // for One_Sequential_PGC_Titles.
+ // THIS SHOULD CHANGE, RIGHT?
+ HRESULT GetTotalTitleTime
+ ( [out] DVD_HMSF_TIMECODE* pTotalTime,
+ [out] ULONG* ulTimeCodeFlags // union of DVD_TIMECODE_FLAGS
+ );
+
+ // GetCurrentButton
+ // Indicates the number of currently available buttons and the current
+ // selected button number. If buttons are not present it returns 0 for
+ // both pulButtonsAvailable and pulCurrentButton
+ HRESULT GetCurrentButton
+ ( [out] ULONG * pulButtonsAvailable,
+ [out] ULONG * pulCurrentButton
+ );
+
+ // GetCurrentAngle
+ // Indicates the number of currently available angles and the current
+ // selected angle number. If *pulAnglesAvailable is returned as 1 then
+ // the current content is not multiangle.
+ HRESULT GetCurrentAngle
+ ( [out] ULONG * pulAnglesAvailable,
+ [out] ULONG * pulCurrentAngle
+ );
+
+ // GetCurrentAudio
+ // Indicates the number of currently available audio streams and
+ // the currently selected audio stream number.
+ // This only works inside the Title domain.
+ HRESULT GetCurrentAudio
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream
+ );
+
+ // GetCurrentSubpicture
+ // Indicates the number of currently available subpicture streams,
+ // the currently selected subpicture stream number, and if the
+ // subpicture display is currently disabled. Subpicture streams
+ // authored as "Forcedly Activated" stream will be displayed even if
+ // subpicture display has been disabled by the app with
+ // IDVDControl::SetSubpictureState.
+ // This only works inside the Title domain.
+ HRESULT GetCurrentSubpicture
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream,
+ [out] BOOL * pbIsDisabled
+ );
+
+ // GetCurrentUOPS
+ // Indicates which IDVDControl methods (Annex J user operations) are
+ // currently valid. DVD titles can enable or disable individual user
+ // operations at almost any point during playback.
+ HRESULT GetCurrentUOPS
+ ( [out] ULONG * pulUOPs
+ );
+
+ // GetAllSPRMs
+ // Returns the current contents of all DVD System Parameter Registers.
+ // See DVD-Video spec for use of individual registers.
+ // WE SHOULD DOC THE SPRMs RATHER THAN ASKING TO REFER TO DVD SPEC.
+ HRESULT GetAllSPRMs
+ ( [out] SPRMARRAY * pRegisterArray
+ );
+
+ // GetAllGPRMs
+ // Returns the current contents of all DVD General Parameter Registers.
+ // Use of GPRMs is title specific.
+ // WE SHOULD DOC THE GPRMs RATHER THAN ASKING TO REFER TO DVD SPEC.
+ HRESULT GetAllGPRMs
+ ( [out] GPRMARRAY * pRegisterArray
+ );
+
+ // GetAudioLanguage
+ // Returns the language of the specified stream within the current title.
+ // Does not return languages for menus. Returns *pLanguage as 0 if the
+ // stream does not include language.
+ // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the returned LCID.
+ HRESULT GetAudioLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetSubpictureLanguage
+ // Returns the language of the specified stream within the current title.
+ // Does not return languages for menus. Returns *pLanguage=0 as 0 if the
+ // stream does not include language.
+ // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the returned LCID.
+ HRESULT GetSubpictureLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetTitleAttributes
+ // Returns attributes of all video, audio, and subpicture streams for the
+ // specified title including menus.
+ // If 0xffffffff is specified as ulTitle, attributes for the current title
+ // are returned.
+ HRESULT GetTitleAttributes
+ ( [in] ULONG ulTitle, // requested title number
+ [out] DVD_MenuAttributes * pMenu,
+ [out] DVD_TitleAttributes * pTitle
+ );
+
+ // GetVMGAttributes
+ // Returns attributes of all video, audio, and subpicture
+ // streams for Video Manager Menus. This method suppliments GetTitleAttributes()
+ // for some menus, such as the Title menu, which are in a separate group of
+ // streams called the VMG (Video Manager) and are not associated with any
+ // particular title number.
+ HRESULT GetVMGAttributes
+ ( [out] DVD_MenuAttributes* pATR
+ );
+
+ // GetCurrentVideoAttributes
+ // Returns the video attributes for the current title or menu.
+ //
+ HRESULT GetCurrentVideoAttributes
+ ( [out] DVD_VideoAttributes * pATR
+ );
+
+ // GetAudioAttributes
+ // Returns the audio attributes for the specified stream in the current title
+ // or menu.
+ HRESULT GetAudioAttributes
+ ( [in] ULONG ulStream,
+ [out] DVD_AudioAttributes *pATR
+ );
+
+ // GetKaraokeChannelContents
+ // Returns the karaoke contents of each channel of the specified stream in the current title
+ // or menu.
+ HRESULT GetKaraokeAttributes
+ ( [in] ULONG ulStream,
+ [out] DVD_KaraokeAttributes* pAttributes
+ );
+
+ // GetSubpictureAttributes
+ // Returns the subpicture attributes for the specified stream in the current
+ // title or menu.
+ HRESULT GetSubpictureAttributes
+ ( [in] ULONG ulStream,
+ [out] DVD_SubpictureAttributes *pATR
+ );
+
+ // GetDVDVolumeInfo
+ // Returns current DVD volume information.
+ HRESULT GetDVDVolumeInfo
+ ( [out] ULONG *pulNumOfVolumes, // number of volumes (disc sides?) in a volume set
+ [out] ULONG *pulVolume, // volume number for current DVD directory
+ [out] DVD_DISC_SIDE *pSide, // current disc side
+ [out] ULONG *pulNumOfTitles // number of titles available in this volume
+ );
+
+ // GetDVDTextNumberOfLanguages
+ // Returns the number of text languages for the current DVD directory.
+ // Should return some error code if no root directory is found.
+ HRESULT GetDVDTextNumberOfLanguages
+ ( [out] ULONG * pulNumOfLangs
+ );
+
+ // GetDVDTextLanguageInfo
+ // Returns the text languages information (number of strings, language code,
+ // char set) for the specified language index.
+ // Should return some error code if an invalid text index is specified.
+ HRESULT GetDVDTextLanguageInfo
+ ( [in] ULONG ulLangIndex,
+ [out] ULONG* pulNumOfStrings,
+ [out] LCID* pLangCode,
+ [out] enum DVD_TextCharSet * pbCharacterSet
+ );
+
+ // GetDVDTextStringAsNative
+ // Returns the text string as an array of bytes for the specified language
+ // index.and string index.
+ // Should return some error code if an invalid text or string index is specified.
+ // It also just returns the length of the string if pchBuffer is specified as NULL.
+ HRESULT GetDVDTextStringAsNative
+ ( [in] ULONG ulLangIndex,
+ [in] ULONG ulStringIndex,
+ [out] BYTE* pbBuffer,
+ [in] ULONG ulMaxBufferSize,
+ [out] ULONG* pulActualSize,
+ [out] enum DVD_TextStringType* pType
+ );
+
+ // GetDVDTextStringAsUnicode
+ // Returns the text string in Unicode for the specified language index.and string index.
+ // Should return some error code if an invalid text or string index is specified.
+ // It also just returns the length of the string if pchBuffer is specified as NULL.
+ HRESULT GetDVDTextStringAsUnicode
+ ( [in] ULONG ulLangIndex,
+ [in] ULONG ulStringIndex,
+ [out] WCHAR* pchwBuffer,
+ [in] ULONG ulMaxBufferSize,
+ [out] ULONG* pulActualSize,
+ [out] enum DVD_TextStringType* pType
+ );
+
+ // GetPlayerParentalLevel
+ // Returns the current parental level and the current country code that has
+ // been set in the system registers in player.
+ // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
+ // Valid Parental Levels range from 1 to 8 if parental management is enabled.
+ // Returns 0xffffffff if parental management is disabled
+ // See ISO3166 : Alpha-2 Code for the country codes.
+ HRESULT GetPlayerParentalLevel
+ ( [out] ULONG *pulParentalLevel, // current parental level
+ [out] BYTE pbCountryCode[2] // current country code
+ );
+
+ // GetNumberOfChapters
+ // Returns the number of chapters that are defined for a
+ // given title.
+ HRESULT GetNumberOfChapters
+ ( [in] ULONG ulTitle, // Title for which number of chapters is requested
+ [out] ULONG *pulNumOfChapters // Number of chapters for the specified title
+ );
+
+ // GetTitleParentalLevels
+ // Returns the parental levels that are defined for a particular title.
+ // pulParentalLevels will be combination of DVD_PARENTAL_LEVEL_8,
+ // DVD_PARENTAL_LEVEL_6, or DVD_PARENTAL_LEVEL_1 OR-ed together
+ HRESULT GetTitleParentalLevels
+ ( [in] ULONG ulTitle, // Title for which parental levels are requested
+ [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together
+ );
+
+ // GetDVDDirectory
+ // Returns the root directory that is set in the player. If a valid root
+ // has been found, it returns the root string. Otherwise, it returns 0 for
+ // pcbActualSize indicating that a valid root directory has not been found
+ // or initialized.
+ //
+ // !!! used to return LPTSTR. interface was changed to return
+ // LPSTR (ansi) for compatibility. COM APIs should pass with
+ // UNICODE strings only.
+ //
+ HRESULT GetDVDDirectory
+ ( [out, size_is(ulMaxSize)] LPWSTR pszwPath, // pointer to buffer to get root string
+ [in] ULONG ulMaxSize, // size of buffer in WCHARs passed in
+ [out] ULONG *pulActualSize // size of actual data returned (in WCHARs)
+ );
+
+
+ // IsAudioStreamEnabled
+ //
+ // Determines if the specified audio stream is enabled/disabled in the current PGC.
+ //
+ // ulStreamNum - audio stream number to test
+ // pbEnabled - where to place the result
+ HRESULT IsAudioStreamEnabled
+ ( [in] ULONG ulStreamNum, // stream number to test
+ [out] BOOL *pbEnabled // returned state
+ );
+
+ // GetDiscID
+ //
+ // If pszwPath is specified as NULL, DVD Navigator will use the current path
+ // that would be returned by GetDVDDirectory() at this point.
+ //
+ // Returns a 64-bit identification number for the specified DVD disc.
+ HRESULT GetDiscID
+ ( [in] LPCWSTR pszwPath, // root path (should we rather use const WCHAR*?)
+ [out] ULONGLONG* pullDiscID // 64-bit unique id for the disc
+ ) ;
+
+ // GetState
+ //
+ // The navigator will create a new state object and save the current location into it.
+ // The state object can be used to restore the navigator the saved location at a later time.
+ // A new IDvdState object is created (with a single AddRef) and returned in *pStateData.
+ // The object must be Released() when the application is finished with it.
+ //
+ HRESULT GetState
+ ( [out] IDvdState **pStateData // returned object
+ );
+
+ //
+ // GetMenuLanguages
+ //
+ // Navigator gets all of the menu languages for the VMGM and VTSM domains.
+ //
+ HRESULT GetMenuLanguages
+ ( [out] LCID *pLanguages, // data buffer (NULL returns #languages)
+ [in] ULONG ulMaxLanguages, // maxiumum number of languages to retrieve
+ [out] ULONG *pulActualLanguages // actual number of languages retrieved
+ );
+
+ //
+ // GetButtonAtPosition
+ //
+ // This is typically called in response to a mouse move within the
+ // display window.
+ // It returns the button located at the specified point within the display window.
+ // If no button is present at that position, then VFW_E_DVD_NO_BUTTON is returned.
+ // Button indices start at 1.
+ //
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT GetButtonAtPosition // typically called after a mouse move
+ ( [in] POINT point,
+ [out] ULONG *pulButtonIndex
+ );
+
+ //
+ // GetCmdFromEvent
+ //
+ // This method maps an EC_DVD_CMD_BEGIN/COMPLETE/CANCEL event's lParam1 into an AddRef'd
+ // IDvdCmd pointer. You must Release the returned pointer. NULL is returned if the function
+ // fails.
+ //
+ HRESULT GetCmdFromEvent
+ ( [in] LONG_PTR lParam1,
+ [out] IDvdCmd **pCmdObj
+ );
+
+ // GetDefaultMenuLanguage
+ // Returns the default language for menus.
+ HRESULT GetDefaultMenuLanguage
+ ( [out] LCID * pLanguage
+ );
+
+ // GetDefaultAudioLanguage
+ // Gets the default audio language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT GetDefaultAudioLanguage
+ ( [out] LCID* pLanguage,
+ [out] DVD_AUDIO_LANG_EXT* pAudioExtension
+ );
+
+ // GetDefaultSubpictureLanguage
+ // Gets the default subpicture language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT GetDefaultSubpictureLanguage
+ ( [out] LCID* pLanguage,
+ [out] DVD_SUBPICTURE_LANG_EXT* pSubpictureExtension
+ );
+
+ //
+ // GetDecoderCaps:
+ // Retrieves the DVD decoder's details about max data rate for video, audio
+ // and subpicture (going backward and forward) as well as support for various
+ // types of audio (AC3, MPEG2, DTS, SDDS, LPCM).
+ //
+ HRESULT GetDecoderCaps
+ ( [out] DVD_DECODER_CAPS *pCaps
+ ) ;
+
+ //
+ // GetButtonRect:
+ // Retrieves the coordinates for a given button number
+ //
+ HRESULT GetButtonRect
+ ( [in] ULONG ulButton,
+ [out] RECT *pRect
+ ) ;
+
+ // IsSubpictureStreamEnabled
+ //
+ // Determines if the specified subpicture stream is enabled/disabled in the current PGC.
+ //
+ // ulStreamNum - Subpicture stream number to test
+ // pbEnabled - where to place the result
+ HRESULT IsSubpictureStreamEnabled
+ ( [in] ULONG ulStreamNum, // stream number to test
+ [out] BOOL *pbEnabled // returned state
+ );
+}
+
+
+
+//==========================================================================
+//==========================================================================
+//
+// typedefs used by IDvdGraphBuilder interface.
+//
+//==========================================================================
+//==========================================================================
+
+typedef enum _AM_DVD_GRAPH_FLAGS {
+ AM_DVD_HWDEC_PREFER = 0x01, // default
+ AM_DVD_HWDEC_ONLY = 0x02,
+ AM_DVD_SWDEC_PREFER = 0x04,
+ AM_DVD_SWDEC_ONLY = 0x08,
+ AM_DVD_NOVPE = 0x100,
+ AM_DVD_VMR9_ONLY = 0x800 // only use VMR9 (otherwise fail) for rendering
+} AM_DVD_GRAPH_FLAGS ;
+
+typedef enum _AM_DVD_STREAM_FLAGS {
+ AM_DVD_STREAM_VIDEO = 0x01,
+ AM_DVD_STREAM_AUDIO = 0x02,
+ AM_DVD_STREAM_SUBPIC = 0x04
+} AM_DVD_STREAM_FLAGS ;
+
+typedef struct {
+ HRESULT hrVPEStatus ; // VPE mixing error code (0 => success)
+ BOOL bDvdVolInvalid ; // Is specified DVD volume invalid?
+ BOOL bDvdVolUnknown ; // Is DVD volume to be played not specified/not found?
+ BOOL bNoLine21In ; // video decoder doesn't produce line21 (CC) data
+ BOOL bNoLine21Out ; // can't show decoded line21 data as CC on video
+ int iNumStreams ; // number of DVD streams to render
+ int iNumStreamsFailed ; // number of streams failed to render
+ DWORD dwFailedStreamsFlag ; // combination of flags to indicate failed streams
+} AM_DVD_RENDERSTATUS ;
+
+
+//
+// IDvdGraphBuilder interface to build a filter graph for DVD-Video playback.
+//
+
+[
+ object,
+ local,
+ uuid(FCC152B6-F372-11d0-8E00-00C04FD7C08B),
+ pointer_default(unique)
+]
+interface IDvdGraphBuilder : IUnknown {
+
+ // Returns the IGraphBuilder interface for the filtergraph used by the
+ // CDvdGraphBuilder object.
+ // Remember to *ppGB->Release() when you're done with it
+ HRESULT GetFiltergraph
+ ( [out] IGraphBuilder **ppGB
+ ) ;
+
+ // Gets specific interface pointers in the DVD-Video playback graph to
+ // make DVD-Video playback development easier.
+ // It helps get the following interfaces to control playback/show CC/
+ // position window/control volume etc:
+ // - IDvdControl, IDvdInfo
+ // - IAMLine21Decoder
+ // - IVideoWindow, IBasicVideo
+ // - IBasicAudio
+ // This method will return
+ // a) E_INVALIDARG if ppvIF is invalid
+ // b) E_NOINTERFACE if riid is an IID we don't know about
+ // c) VFW_E_DVD_GRAPHNOTREADY if the graph has not been built through
+ // RenderDvdVideoVolume() yet.
+ // Remember to *ppvIF->Release() when you're done with it
+ HRESULT GetDvdInterface
+ ( [in] REFIID riid, // IID of the interface required
+ [out] void **ppvIF // returns pointer to the required interface
+ ) ;
+
+ // Builds a filter graph according to user specs for playing back a
+ // DVD-Video volume.
+ // This method returns S_FALSE if
+ // 1. the graph has been either built, but either
+ // a) VPE mixing doesn't work (app didn't use AM_DVD_NOVPE flag)
+ // b) video decoder doesn't produce line21 data
+ // c) line21 data couldn't be rendered (decoding/mixing problem)
+ // d) the call specified an invalid volume path or DVD Nav couldn't
+ // locate any DVD-Video volume to be played.
+ // 2. some streams didn't render (completely), but the others have
+ // been rendered so that the volume can be partially played back.
+ // The status is indicated through the fields of the pStatus (out)
+ // parameter.
+ // About 1(a), the app will have enough info to tell the user that the
+ // video won't be visible unless a TV is connected to the NTSC out
+ // port of the DVD decoder (presumably HW in this case).
+ // For case 1(b) & (c), the app "can" put up a warning/informative message
+ // that closed captioning is not available because of the decoder.
+ // 1(d) helps an app to ask the user to insert a DVD-Video disc if none
+ // is specified/available in the drive when playback is started.
+ // This method builds the graph even if
+ // - an invalid DVD-Video volume is specified
+ // - the caller uses lpwszPathName = NULL to make the DVD Nav to locate
+ // the default volume to be played back, but DVD Nav doesn't find a
+ // default DVD-Video volume to be played back.
+ // An app can later specify the volume using IDvdControl::SetRoot()
+ // method.
+ // #2 will help the app indicate to the user that some of the streams
+ // can't be played.
+ //
+ // The graph is built using filters based on the dwFlags value (to use
+ // HW decoders or SW decoders or a mix of them).
+ // The dwFlags value is one of the values in AM_DVD_GRAPH_FLAGS enum
+ // type. The default value is AM_DVD_HWDEC_PREFER. None of the
+ // AM_DVD_HWDEC_xxx or AM_DVD_SWDEC_xxx flags can be mixed. However
+ // AM_DVD_NOVPE can be OR-ed with any of the AM_DVD_HWDEC_xxx flags.
+ //
+ // The method returns S_OK if the playback graph is built successfully
+ // with all the streams completely rendered and a valid DVD-Video volume
+ // is specified or a default one has been located.
+ //
+ // If the dwFlags specify conflicting options, E_INVALIDARG is returned.
+ // If the graph building fails, the method returns one of the following
+ // error codes:
+ // VFW_E_DVD_RENDERFAIL, VFW_E_DVD_DECNOTENOUGH
+ //
+ HRESULT RenderDvdVideoVolume
+ ( [in] LPCWSTR lpcwszPathName, // Can be NULL too
+ [in] DWORD dwFlags, // 0 is the default (use max HW)
+ [out] AM_DVD_RENDERSTATUS *pStatus // returns indications of ANY failure
+ ) ;
+}
+
+
+//
+// DDraw Exclusive Mode Video standard COM interface for Overlay Mixer
+//
+[
+ object,
+ local,
+ uuid(153ACC21-D83B-11d1-82BF-00A0C9696C8F),
+ pointer_default(unique)
+]
+interface IDDrawExclModeVideo : IUnknown {
+ // set a ddraw object to be used by the overlay mixer. If even one of the pins
+ // of the ovmixer is connected, then it won't start using the new ddraw obect
+ // immediately but just cache it. It will start using it the next time, all its
+ // pins are disconnected.
+ HRESULT SetDDrawObject([in] IDirectDraw *pDDrawObject);
+
+ // gets the ddraw object currently being used by the overlay mixer. If the app has not
+ // set any ddraw object and the ovmixer has not yet allocated one, then *ppDDrawObject
+ // will be set to NULL and *pbUsingExternal will be set TO FALSE. Otherwise *pbUsingExternal
+ // will be set to TRUE if the ovmixer is currently USING an app given ddraw object and FALSE
+ // othewise
+ HRESULT GetDDrawObject([out] IDirectDraw **ppDDrawObject,
+ [out] BOOL *pbUsingExternal);
+
+ // set a primary surface to be used by the overlay mixer. If even one of the pins
+ // of the ovmixer is connected, then it won't start using the new primary surface
+ // immediately but just cache it. It will start using it the next time, all its
+ // pins are disconnected.
+ // Also when the ovmixer does start using an app given primary surface, it will delete
+ // its output pin (and not draw its own colorkey) since the app is expected to do the
+ // window management and drawing colorkey etc on the primary surface
+ // This function makes sure that the surface provided exposes IDirectDrawSurface3, and
+ // is consistent with the ddraw object provided.
+ HRESULT SetDDrawSurface([in] IDirectDrawSurface *pDDrawSurface);
+
+ // gets the ddraw surface currently being used by the overlay mixer. If the app has not
+ // set any ddraw surface and the ovmixer has not yet allocated one, then *ppDDrawSurface
+ // will be set to NULL and *pbUsingExternal will be set to FALSE. Otherwise *pbUsingExternal
+ // will be set to TRUE if the ovmixer is curretnly USING an app given ddraw surface and FALSE
+ // otherwise
+ HRESULT GetDDrawSurface([out] IDirectDrawSurface **ppDDrawSurface,
+ [out] BOOL *pbUsingExternal);
+
+ // set draw paramters on the ovmixer (src and dest rect). Note that if the mode
+ // of the ovmixer is set to LETTER_BOX, then the ovmixer might show the video in
+ // only a subrect of *prcTarget (see IMixerPinConfig for details).
+ HRESULT SetDrawParameters([in] const RECT * prcSource,
+ [in] const RECT * prcTarget);
+
+ // gets the current video size and picture aspect ratio of the primary stream of the overlay mixer
+ // The app should look for the evene EC_VIDEO_SIZE_AR_CHANGED and on its receipt
+ // call this function again
+ HRESULT GetNativeVideoProps([out] DWORD *pdwVideoWidth,
+ [out] DWORD *pdwVideoHeight,
+ [out] DWORD *pdwPictAspectRatioX,
+ [out] DWORD *pdwPictAspectRatioY);
+
+ // Set the callback interface - the callback interface will be defined in a later release
+ // Currently returns E_NOTIMPL
+ HRESULT SetCallbackInterface([in] IDDrawExclModeVideoCallback *pCallback,
+ [in] DWORD dwFlags);
+}
+
+
+//
+// DDraw Exclusive Mode Video callbacks
+//
+
+// enum for flags
+enum _AM_OVERLAY_NOTIFY_FLAGS {
+ AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x00000001,
+ AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x00000002,
+ AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x00000004
+};
+[
+ object,
+ local,
+ uuid(913c24a0-20ab-11d2-9038-00a0c9697298),
+ pointer_default(unique)
+]
+interface IDDrawExclModeVideoCallback : IUnknown {
+
+ // Called once before UpdateOverlay is called with bBefore == TRUE
+ // and once after it is called with bBefore == FALSE and otherwise
+ // identical parameters
+ HRESULT OnUpdateOverlay(
+ [in] BOOL bBefore, // After UpdateOverlayCalled?
+ [in] DWORD dwFlags,// _AM_OVERLAY_NOTIFY enum
+ [in] BOOL bOldVisible,
+ [in] const RECT *prcOldSrc,
+ [in] const RECT *prcOldDest,
+ [in] BOOL bNewVisible,
+ [in] const RECT *prcNewSrc,
+ [in] const RECT *prcNewDest);
+
+ // Called when the surface color key is changed
+ HRESULT OnUpdateColorKey(
+ [in] const COLORKEY *pKey,
+ [in] DWORD dwColor);
+
+ // Called when the video size or aspect ratio changes
+ HRESULT OnUpdateSize( [in] DWORD dwWidth, // Movie pixel width
+ [in] DWORD dwHeight, // Movie pixel height
+ [in] DWORD dwARWidth, // Aspect ratio horizontal
+ [in] DWORD dwARHeight); // Aspect ratio vertical
+}
diff --git a/dxsdk/Include/DShowIDL/dxtrans.idl b/dxsdk/Include/DShowIDL/dxtrans.idl
new file mode 100644
index 00000000..6395d325
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/dxtrans.idl
@@ -0,0 +1,1289 @@
+//------------------------------------------------------------------------------
+//
+// Copyright Microsoft Corporation 1997-2000
+// All rights reserved.
+//
+// File: dxtrans.idl
+//
+// Overview:
+// This is the IDL file for DirectX installable transform coclass,
+// interface, and type definitions.
+//
+//------------------------------------------------------------------------------
+
+cpp_quote("#include <servprov.h>")
+cpp_quote("#include <ddraw.h>")
+cpp_quote("#include <d3d.h>")
+cpp_quote("#include <d3drm.h>")
+cpp_quote("#include <urlmon.h>")
+
+//--- Import base idl
+import "oaidl.idl";
+import "ocidl.idl";
+import "servprov.idl";
+import "comcat.idl";
+
+//
+// Since direct draw does not have an IDL, we'll define DDSURFACEDESC to
+// be a void, but include ddraw.h in the header file. This makes MIDL happy.
+//
+#ifndef DDSURFACEDESC
+cpp_quote("#if 0")
+cpp_quote("// Bogus definition used to make MIDL compiler happy")
+typedef void DDSURFACEDESC;
+typedef void D3DRMBOX;
+typedef void D3DVECTOR;
+typedef void D3DRMMATRIX4D;
+typedef void* LPSECURITY_ATTRIBUTES;
+cpp_quote("#endif")
+#endif
+//--- Additional includes
+
+//--- Export
+cpp_quote( "#ifdef _DXTRANSIMPL")
+cpp_quote( " #define _DXTRANS_IMPL_EXT _declspec(dllexport)")
+cpp_quote( "#else")
+cpp_quote( " #define _DXTRANS_IMPL_EXT _declspec(dllimport)")
+cpp_quote( "#endif")
+
+//=== Forward References ====================================================
+interface IDXTransformFactory;
+interface IDXTransform;
+interface IDXTaskManager;
+interface IDXSurfaceFactory;
+interface IDXSurface;
+interface IDXARGBSurfaceInit;
+interface IDXRawSurface;
+interface IDXARGBReadPtr;
+interface IDXARGBReadWritePtr;
+interface IDXDCLock;
+interface IDXTScale;
+interface IDXLookupTable;
+interface IDXTBindHost;
+interface IBindHost;
+interface IDXTScaleOutput;
+interface IDXGradient;
+
+//=== Constants =============================================================
+
+cpp_quote("//")
+cpp_quote("// All GUIDs for DXTransform are declared in DXTGUID.C in the SDK include directory")
+cpp_quote("//")
+cpp_quote("EXTERN_C const GUID DDPF_RGB1;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB2;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB4;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB8;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB332;")
+cpp_quote("EXTERN_C const GUID DDPF_ARGB4444;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB565;")
+cpp_quote("EXTERN_C const GUID DDPF_BGR565;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB555;")
+cpp_quote("EXTERN_C const GUID DDPF_ARGB1555;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB24;")
+cpp_quote("EXTERN_C const GUID DDPF_BGR24;")
+cpp_quote("EXTERN_C const GUID DDPF_RGB32;")
+cpp_quote("EXTERN_C const GUID DDPF_BGR32;")
+cpp_quote("EXTERN_C const GUID DDPF_ABGR32;")
+cpp_quote("EXTERN_C const GUID DDPF_ARGB32;")
+cpp_quote("EXTERN_C const GUID DDPF_PMARGB32;")
+cpp_quote("EXTERN_C const GUID DDPF_A1;")
+cpp_quote("EXTERN_C const GUID DDPF_A2;")
+cpp_quote("EXTERN_C const GUID DDPF_A4;")
+cpp_quote("EXTERN_C const GUID DDPF_A8;")
+cpp_quote("EXTERN_C const GUID DDPF_Z8;")
+cpp_quote("EXTERN_C const GUID DDPF_Z16;")
+cpp_quote("EXTERN_C const GUID DDPF_Z24;")
+cpp_quote("EXTERN_C const GUID DDPF_Z32;")
+cpp_quote("//")
+cpp_quote("// Component categories")
+cpp_quote("//")
+cpp_quote("EXTERN_C const GUID CATID_DXImageTransform;")
+cpp_quote("EXTERN_C const GUID CATID_DX3DTransform;")
+cpp_quote("EXTERN_C const GUID CATID_DXAuthoringTransform;")
+cpp_quote("EXTERN_C const GUID CATID_DXSurface;")
+cpp_quote("//")
+cpp_quote("// Service IDs")
+cpp_quote("//")
+cpp_quote("EXTERN_C const GUID SID_SDirectDraw;")
+cpp_quote("EXTERN_C const GUID SID_SDirect3DRM;")
+cpp_quote("#define SID_SDXTaskManager CLSID_DXTaskManager")
+cpp_quote("#define SID_SDXSurfaceFactory IID_IDXSurfaceFactory")
+cpp_quote("#define SID_SDXTransformFactory IID_IDXTransformFactory")
+cpp_quote("//")
+cpp_quote("// DXTransforms Core Type Library Version Info")
+cpp_quote("//")
+cpp_quote("#define DXTRANS_TLB_MAJOR_VER 1")
+cpp_quote("#define DXTRANS_TLB_MINOR_VER 1")
+
+//=== Struct & Enum definitions =============================================
+
+//=== Interface definitions =================================================
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXBaseObject
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(17B59B2B-9CC8-11d1-9053-00C04FD9189D),
+ helpstring("IDXBaseObject Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXBaseObject : IUnknown
+ {
+ HRESULT GetGenerationId( [out]ULONG *pID);
+ HRESULT IncrementGenerationId([in] BOOL bRefresh);
+ HRESULT GetObjectSize( [out] ULONG *pcbSize);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// Bounding rectangle and vector structures.
+//
+//------------------------------------------------------------------------------
+
+ //--- Dimension identifiers
+ typedef enum DXBNDID
+ {
+ DXB_X = 0,
+ DXB_Y = 1,
+ DXB_Z = 2,
+ DXB_T = 3
+ } DXBNDID;
+
+ //--- Bound types
+ typedef enum DXBNDTYPE
+ {
+ DXBT_DISCRETE,
+ DXBT_DISCRETE64,
+ DXBT_CONTINUOUS,
+ DXBT_CONTINUOUS64
+ } DXBNDTYPE;
+
+ //--- Discrete bounds (image & sound)
+ typedef struct DXDBND
+ {
+ long Min;
+ long Max;
+ } DXDBND;
+ typedef DXDBND DXDBNDS[4];
+
+ typedef struct DXDBND64
+ {
+ LONGLONG Min;
+ LONGLONG Max;
+ } DXDBND64;
+ typedef DXDBND64 DXDBNDS64[4];
+
+ //--- Continuous bounds (geometry)
+ typedef struct DXCBND
+ {
+ float Min;
+ float Max;
+ } DXCBND;
+ typedef DXCBND DXCBNDS[4];
+
+ typedef struct DXCBND64
+ {
+ double Min;
+ double Max;
+ } DXCBND64;
+ typedef DXCBND64 DXCBNDS64[4];
+
+ //--- Combined space
+ typedef union DXBNDS switch( DXBNDTYPE eType ) u
+ {
+ case DXBT_DISCRETE:
+ DXDBND D[4];
+ case DXBT_DISCRETE64:
+ DXDBND64 LD[4];
+ case DXBT_CONTINUOUS:
+ DXCBND C[4];
+ case DXBT_CONTINUOUS64:
+ DXCBND64 LC[4];
+ } DXBNDS;
+
+ //--- Discrete 4D vector
+ typedef long DXDVEC[4];
+ typedef LONGLONG DXDVEC64[4];
+
+ //--- Continous 4D vector
+ typedef float DXCVEC[4];
+ typedef double DXCVEC64[4];
+
+ //--- Combined space vector
+ typedef union DXVEC switch( DXBNDTYPE eType ) u
+ {
+ case DXBT_DISCRETE:
+ long D[4];
+ case DXBT_DISCRETE64:
+ LONGLONG LD[4];
+ case DXBT_CONTINUOUS:
+ float C[4];
+ case DXBT_CONTINUOUS64:
+ double LC[4];
+ } DXVEC;
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXTransformFactory
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(6A950B2B-A971-11d1-81C8-0000F87557DB),
+ helpstring("IDXTransformFactory Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXTransformFactory : IServiceProvider
+ {
+ HRESULT SetService( [in]REFGUID guidService,
+ [in]IUnknown *pUnkService,
+ [in]BOOL bWeakReference);
+
+ HRESULT CreateTransform( [in, size_is(ulNumInputs)]IUnknown** punkInputs,
+ [in]ULONG ulNumInputs,
+ [in, size_is(ulNumOutputs)]IUnknown** punkOutputs,
+ [in]ULONG ulNumOutputs,
+ [in]IPropertyBag* pInitProps, [in]IErrorLog* pErrLog,
+ [in]REFCLSID TransCLSID, [in]REFIID TransIID,
+ [out, iid_is(TransIID)]void** ppTransform );
+
+ HRESULT InitializeTransform( [in]IDXTransform* pTransform,
+ [in, size_is(ulNumInputs)]IUnknown** punkInputs,
+ [in]ULONG ulNumInputs,
+ [in, size_is(ulNumOutputs)]IUnknown** punkOutputs,
+ [in]ULONG ulNumOutputs,
+ [in]IPropertyBag* pInitProps, [in]IErrorLog* pErrLog );
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXTransform
+//
+//------------------------------------------------------------------------------
+
+ typedef enum DXTMISCFLAGS
+ {
+ DXTMF_BLEND_WITH_OUTPUT = ( 1L << 0 ),
+ DXTMF_DITHER_OUTPUT = ( 1L << 1 ),
+ DXTMF_OPTION_MASK = (0x0000FFFF), // Low word is settable options
+ DXTMF_VALID_OPTIONS = (DXTMF_BLEND_WITH_OUTPUT | DXTMF_DITHER_OUTPUT),
+ //
+ // Status flags can not be changed by call to SetMiscFlags
+ //
+ DXTMF_BLEND_SUPPORTED = ( 1L << 16 ),
+ DXTMF_DITHER_SUPPORTED = ( 1L << 17 ),
+ DXTMF_INPLACE_OPERATION = ( 1L << 24 ),
+ DXTMF_BOUNDS_SUPPORTED = ( 1L << 25 ),
+ DXTMF_PLACEMENT_SUPPORTED = ( 1L << 26 ),
+ DXTMF_QUALITY_SUPPORTED = ( 1L << 27 ),
+ DXTMF_OPAQUE_RESULT = ( 1L << 28 )
+ } DXTMISCFLAGS;
+
+ typedef enum DXINOUTINFOFLAGS
+ {
+ DXINOUTF_OPTIONAL = ( 1L << 0)
+ } DXINOUTINFOFLAGS;
+
+ [
+ object,
+ uuid(30A5FB78-E11F-11d1-9064-00C04FD9189D),
+ helpstring("IDXTransform Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXTransform : IDXBaseObject
+ {
+ HRESULT Setup( [in, size_is(ulNumInputs)] IUnknown * const * punkInputs,
+ [in]ULONG ulNumInputs,
+ [in, size_is(ulNumOutputs)] IUnknown * const * punkOutputs,
+ [in]ULONG ulNumOutputs,
+ [in]DWORD dwFlags );
+ HRESULT Execute( [in]const GUID* pRequestID, [in]const DXBNDS *pClipBnds,
+ [in]const DXVEC *pPlacement );
+ HRESULT MapBoundsIn2Out( [in] const DXBNDS *pInBounds,
+ [in]ULONG ulNumInBnds,
+ [in]ULONG ulOutIndex,
+ [out]DXBNDS *pOutBounds );
+ HRESULT MapBoundsOut2In( [in] ULONG ulOutIndex,
+ [in] const DXBNDS *pOutBounds,
+ [in] ULONG ulInIndex,
+ [out]DXBNDS *pInBounds );
+ HRESULT SetMiscFlags( [in] DWORD dwMiscFlags);
+ HRESULT GetMiscFlags( [out]DWORD * pdwMiscFlags );
+ HRESULT GetInOutInfo( [in]BOOL bIsOutput, [in]ULONG ulIndex,
+ [out]DWORD *pdwFlags, [out, size_is(*pcIDs)] GUID *pIDs,
+ [in, out] ULONG *pcIDs,
+ [out] IUnknown **ppUnkCurrentObject);
+ HRESULT SetQuality( [in] float fQuality );
+ HRESULT GetQuality( [out] float * fQuality );
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXSurfacePick
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(30A5FB79-E11F-11d1-9064-00C04FD9189D),
+ helpstring("IDXSurfacePick Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXSurfacePick : IUnknown
+ {
+ HRESULT PointPick([in]const DXVEC *pPoint,
+ [out]ULONG * pulInputSurfaceIndex,
+ [out]DXVEC *pInputPoint);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXTBindHost
+//
+// Overview:
+// This interface is used to set a site-specific bind host for a transform.
+// Only transforms that need access to a bind host need to implement this
+// interface.
+//
+// For some reason, MIDL does not like IBindHost, so we've declared this
+// interface local.
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(D26BCE55-E9DC-11d1-9066-00C04FD9189D),
+ helpstring("IDXTBindHost Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXTBindHost : IUnknown
+ {
+ HRESULT SetBindHost([in] IBindHost * pBindHost);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXTaskManager
+//
+// Overview:
+// This interface is used to implement a task managment service provider to
+// optimize thread usage.
+//
+//------------------------------------------------------------------------------
+
+ typedef void (__stdcall DXTASKPROC)(void *pTaskData, BOOL* pbContinueProcessing );
+ typedef DXTASKPROC *PFNDXTASKPROC;
+
+ typedef void (__stdcall DXAPCPROC)(DWORD dwData);
+ typedef DXAPCPROC *PFNDXAPCPROC;
+
+cpp_quote("#ifdef __cplusplus")
+
+ cpp_quote("typedef struct DXTMTASKINFO" )
+ cpp_quote("{")
+ cpp_quote(" PFNDXTASKPROC pfnTaskProc; // Pointer to function to execute")
+ cpp_quote(" PVOID pTaskData; // Pointer to argument data")
+ cpp_quote(" PFNDXAPCPROC pfnCompletionAPC; // Pointer to completion APC proc")
+ cpp_quote(" DWORD dwCompletionData; // Pointer to APC proc data")
+ cpp_quote(" const GUID* pRequestID; // Used to identify groups of tasks")
+ cpp_quote("} DXTMTASKINFO;")
+
+cpp_quote("#else")
+
+ typedef struct DXTMTASKINFO
+ {
+ PVOID pfnTaskProc; // Pointer to function to execute
+ PVOID pTaskData; // Pointer to argument data
+ PVOID pfnCompletionAPC; // Pointer to completion APC proc
+ DWORD dwCompletionData; // Pointer to APC proc data
+ const GUID* pRequestID; // Used to identify groups of tasks
+ } DXTMTASKINFO;
+
+cpp_quote("#endif")
+
+ [
+ object,
+ uuid(254DBBC1-F922-11d0-883A-3C8B00C10000),
+ helpstring("IDXTaskManager Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXTaskManager : IUnknown
+ {
+ HRESULT QueryNumProcessors( [out]ULONG* pulNumProc );
+ HRESULT SetThreadPoolSize( [in]ULONG ulNumThreads );
+ HRESULT GetThreadPoolSize( [out]ULONG* pulNumThreads );
+ HRESULT SetConcurrencyLimit( [in]ULONG ulNumThreads );
+ HRESULT GetConcurrencyLimit( [out]ULONG* pulNumThreads );
+ HRESULT ScheduleTasks( [in]DXTMTASKINFO TaskInfo[],
+ [in]HANDLE Events[],
+ [out]DWORD TaskIDs[],
+ [in]ULONG ulNumTasks, [in]ULONG ulWaitPeriod );
+ HRESULT TerminateTasks( [in]DWORD TaskIDs[], [in]ULONG ulCount,
+ [in]ULONG ulTimeOut );
+ HRESULT TerminateRequest( [in]REFIID RequestID, [in]ULONG ulTimeOut );
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// Sample structures (C++)
+//
+// Overview:
+// We want an operator so that we can cast from a DXSAMPLE to a DWORD, so
+// for C++ we will define the structure a special way.
+//
+//------------------------------------------------------------------------------
+
+cpp_quote("#ifdef __cplusplus")
+
+ cpp_quote("/////////////////////////////////////////////////////")
+ cpp_quote("")
+ cpp_quote("class DXBASESAMPLE;")
+ cpp_quote("class DXSAMPLE;")
+ cpp_quote("class DXPMSAMPLE;")
+ cpp_quote("")
+ cpp_quote("/////////////////////////////////////////////////////")
+ cpp_quote("")
+ cpp_quote("class DXBASESAMPLE")
+ cpp_quote("{")
+ cpp_quote("public:")
+ cpp_quote(" BYTE Blue;")
+ cpp_quote(" BYTE Green;")
+ cpp_quote(" BYTE Red;")
+ cpp_quote(" BYTE Alpha;")
+ cpp_quote(" DXBASESAMPLE() {}")
+ cpp_quote(" DXBASESAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :")
+ cpp_quote(" Alpha(alpha),")
+ cpp_quote(" Red(red),")
+ cpp_quote(" Green(green),")
+ cpp_quote(" Blue(blue) {}")
+ cpp_quote(" DXBASESAMPLE(const DWORD val) { *this = (*(DXBASESAMPLE *)&val); }")
+ cpp_quote(" operator DWORD () const {return *((DWORD *)this); }")
+ cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXBASESAMPLE *)&val); }")
+ cpp_quote("}; // DXBASESAMPLE")
+ cpp_quote("")
+ cpp_quote("/////////////////////////////////////////////////////")
+ cpp_quote("")
+ cpp_quote("class DXSAMPLE : public DXBASESAMPLE")
+ cpp_quote("{")
+ cpp_quote("public:")
+ cpp_quote(" DXSAMPLE() {}")
+ cpp_quote(" DXSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :")
+ cpp_quote(" DXBASESAMPLE(alpha, red, green, blue) {}")
+ cpp_quote(" DXSAMPLE(const DWORD val) { *this = (*(DXSAMPLE *)&val); }")
+ cpp_quote(" operator DWORD () const {return *((DWORD *)this); }")
+ cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXSAMPLE *)&val); }")
+ cpp_quote(" operator DXPMSAMPLE() const;")
+ cpp_quote("}; // DXSAMPLE")
+ cpp_quote("")
+ cpp_quote("/////////////////////////////////////////////////////")
+ cpp_quote("")
+ cpp_quote("class DXPMSAMPLE : public DXBASESAMPLE")
+ cpp_quote("{")
+ cpp_quote("public:")
+ cpp_quote(" DXPMSAMPLE() {}")
+ cpp_quote(" DXPMSAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) :")
+ cpp_quote(" DXBASESAMPLE(alpha, red, green, blue) {}")
+ cpp_quote(" DXPMSAMPLE(const DWORD val) { *this = (*(DXPMSAMPLE *)&val); }")
+ cpp_quote(" operator DWORD () const {return *((DWORD *)this); }")
+ cpp_quote(" DWORD operator=(const DWORD val) { return *this = *((DXPMSAMPLE *)&val); }")
+ cpp_quote(" operator DXSAMPLE() const;")
+ cpp_quote("}; // DXPMSAMPLE")
+ cpp_quote("")
+ cpp_quote("//")
+ cpp_quote("// The following cast operators are to prevent a direct assignment of a DXSAMPLE to a DXPMSAMPLE")
+ cpp_quote("//")
+ cpp_quote("inline DXSAMPLE::operator DXPMSAMPLE() const { return *((DXPMSAMPLE *)this); }")
+ cpp_quote("inline DXPMSAMPLE::operator DXSAMPLE() const { return *((DXSAMPLE *)this); }")
+
+
+//+-----------------------------------------------------------------------------
+//
+// Sample structures (IDL, C)
+//
+//------------------------------------------------------------------------------
+
+cpp_quote("#else // !__cplusplus")
+
+ typedef struct DXBASESAMPLE
+ {
+ BYTE Blue;
+ BYTE Green;
+ BYTE Red;
+ BYTE Alpha;
+ } DXBASESAMPLE;
+
+ typedef struct DXSAMPLE
+ {
+ BYTE Blue;
+ BYTE Green;
+ BYTE Red;
+ BYTE Alpha;
+ } DXSAMPLE;
+
+ typedef struct DXPMSAMPLE
+ {
+ BYTE Blue;
+ BYTE Green;
+ BYTE Red;
+ BYTE Alpha;
+ } DXPMSAMPLE;
+
+cpp_quote("#endif // !__cplusplus")
+
+//+-----------------------------------------------------------------------------
+//
+// DXRUNINFO structures.
+//
+//------------------------------------------------------------------------------
+
+ typedef enum DXRUNTYPE
+ {
+ DXRUNTYPE_CLEAR = 0, // The run is zero Alpha
+ DXRUNTYPE_OPAQUE = 1, // The run is full Alpha (i.e. 255)
+ DXRUNTYPE_TRANS = 2, // The run is non-zero Alpha
+ DXRUNTYPE_UNKNOWN= 3 // The run type is unknown. Caller must inspect.
+ } DXRUNTYPE;
+
+ const ULONG DX_MAX_RUN_INFO_COUNT = 128; // Defines the maximum number of RUNINFOs in a single row
+
+
+ cpp_quote("// Ignore the definition used by MIDL for TLB generation")
+ cpp_quote("#if 0")
+
+ typedef struct DXRUNINFO
+ {
+ ULONG Bitfields;
+ } DXRUNINFO;
+
+ cpp_quote("#endif // 0")
+
+ // Emit the C definition to the H file directly, as bit fields are not
+ // supported by MIDL.
+
+ cpp_quote("typedef struct DXRUNINFO")
+ cpp_quote("{")
+ cpp_quote(" ULONG Type : 2; // Type")
+ cpp_quote(" ULONG Count : 30; // Number of samples in run")
+ cpp_quote("} DXRUNINFO;")
+
+
+ typedef enum DXSFCREATE
+ {
+ DXSF_FORMAT_IS_CLSID = ( 1L << 0 ),
+ DXSF_NO_LAZY_DDRAW_LOCK = ( 1L << 1 )
+ } DXSFCREATE;
+
+ typedef enum DXBLTOPTIONS
+ {
+ DXBOF_DO_OVER = (1L << 0),
+ DXBOF_DITHER = (1L << 1)
+ } DXBLTOPTIONS;
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXSurfaceModifier
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(144946F5-C4D4-11d1-81D1-0000F87557DB),
+ helpstring("IDXSurfaceFactory Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXSurfaceFactory : IUnknown
+ {
+ HRESULT CreateSurface([in] IUnknown *pDirectDraw,
+ [in] const DDSURFACEDESC * pDDSurfaceDesc,
+ [in] const GUID * pFormatID,
+ [in] const DXBNDS *pBounds,
+ [in] DWORD dwFlags,
+ [in] IUnknown *punkOuter,
+ [in] REFIID riid,
+ [out, iid_is( riid )] void ** ppDXSurface);
+
+ HRESULT CreateFromDDSurface([in] IUnknown *pDDrawSurface,
+ [in] const GUID *pFormatID,
+ [in] DWORD dwFlags,
+ [in] IUnknown *punkOuter,
+ [in] REFIID riid,
+ [out, iid_is( riid )] void ** ppDXSurface);
+
+ HRESULT LoadImage(
+ [in] const LPWSTR pszFileName,
+ [in] IUnknown *pDirectDraw,
+ [in] const DDSURFACEDESC * pDDSurfaceDesc,
+ [in] const GUID *pFormatID,
+ [in] REFIID riid,
+ [out, iid_is( riid )] void ** ppDXSurface);
+
+ HRESULT LoadImageFromStream([in] IStream *pStream,
+ [in] IUnknown *pDirectDraw,
+ [in] const DDSURFACEDESC * pDDSurfaceDesc,
+ [in] const GUID *pFormatID,
+ [in] REFIID riid,
+ [out, iid_is( riid )] void ** ppDXSurface);
+
+ HRESULT CopySurfaceToNewFormat( [in]IDXSurface* pSrc,
+ [in] IUnknown *pDirectDraw,
+ [in] const DDSURFACEDESC * pDDSurfaceDesc,
+ [in] const GUID *pDestFormatID,
+ [out] IDXSurface** ppNewSurface );
+
+ HRESULT CreateD3DRMTexture([in] IDXSurface *pSrc,
+ [in] IUnknown *pDirectDraw,
+ [in] IUnknown *pD3DRM3,
+ [in] REFIID riid,
+ [out, iid_is(riid)] void **ppTexture3);
+
+ HRESULT BitBlt([in] IDXSurface *pDest,
+ [in] const DXVEC *pPlacement,
+ [in] IDXSurface *pSrc,
+ [in] const DXBNDS *pClipBounds,
+ [in] DWORD dwFlags);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXSurfaceModifier
+//
+//------------------------------------------------------------------------------
+
+ typedef enum DXSURFMODCOMPOP
+ {
+ DXSURFMOD_COMP_OVER = 0,
+ DXSURFMOD_COMP_ALPHA_MASK = 1,
+ DXSURFMOD_COMP_MAX_VALID = 1
+ } DXSURFMODCOMPOP;
+
+ [
+ object,
+ uuid(9EA3B637-C37D-11d1-905E-00C04FD9189D),
+ helpstring("IDXSurfaceModifier Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXSurfaceModifier : IUnknown
+ {
+ HRESULT SetFillColor([in] DXSAMPLE Color);
+ HRESULT GetFillColor([out] DXSAMPLE *pColor);
+ HRESULT SetBounds([in] const DXBNDS *pBounds ); // Get supported though IDXSurface interface
+ HRESULT SetBackground([in] IDXSurface *pSurface);
+ HRESULT GetBackground([out] IDXSurface **ppSurface);
+ HRESULT SetCompositeOperation([in] DXSURFMODCOMPOP CompOp);
+ HRESULT GetCompositeOperation([out] DXSURFMODCOMPOP *pCompOp);
+ //
+ // The following methods only apply to the FOREGROUND surface
+ //
+ HRESULT SetForeground([in] IDXSurface *pSurface, [in] BOOL bTile, [in] const POINT * pOrigin);
+ HRESULT GetForeground([out] IDXSurface **ppSurface, [out] BOOL *pbTile, [out] POINT * pOrigin);
+ HRESULT SetOpacity([in] float Opacity);
+ HRESULT GetOpacity([out] float *pOpacity);
+ HRESULT SetLookup( [in]IDXLookupTable * pLookupTable );
+ HRESULT GetLookup( [out]IDXLookupTable ** ppLookupTable );
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXSurface
+//
+//------------------------------------------------------------------------------
+
+ typedef enum DXSAMPLEFORMATENUM
+ {
+ DXPF_FLAGSMASK = (0xFFFF0000), // Top word is flags, low word is enum
+ DXPF_NONPREMULT = (0x00010000), // Flags to be OR'd with pixel formats
+ DXPF_TRANSPARENCY = (0x00020000), // Color key or one-bit alpha (alpha only 0 or 0xFF)
+ DXPF_TRANSLUCENCY = (0x00040000), // Alpha can be any value from 0->0xFF
+ //
+ // This 3-bit field is used to determine what type of dithering to be used
+ //
+ DXPF_2BITERROR = (0x00200000), // 2 bits of error term
+ DXPF_3BITERROR = (0x00300000), // 3 bits of error term for color (16-bit color)
+ DXPF_4BITERROR = (0x00400000), // 4 bits of error term (ARGB 4444)
+ DXPF_5BITERROR = (0x00500000), // 5 bits of error term for color (8-bit color)
+ DXPF_ERRORMASK = (0x00700000), // Mask of bits used for dithering
+
+ DXPF_NONSTANDARD = (0), // To be used for any surface that is not one of the following formats
+ // This can be combined with DXPFNONPREMULT if the surface can work
+ // better in non-premultiplied space.
+ DXPF_PMARGB32 = (1 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY),
+ DXPF_ARGB32 = (2 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY),
+ DXPF_ARGB4444 = (3 | DXPF_NONPREMULT | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY | DXPF_4BITERROR),
+ DXPF_A8 = (4 | DXPF_TRANSPARENCY | DXPF_TRANSLUCENCY),
+ DXPF_RGB32 = (5),
+ DXPF_RGB24 = (6),
+ DXPF_RGB565 = (7 | DXPF_3BITERROR),
+ DXPF_RGB555 = (8 | DXPF_3BITERROR),
+ DXPF_RGB8 = (9 | DXPF_5BITERROR),
+ DXPF_ARGB1555 = (10 | DXPF_TRANSPARENCY | DXPF_3BITERROR),
+ DXPF_RGB32_CK = (DXPF_RGB32 | DXPF_TRANSPARENCY),
+ DXPF_RGB24_CK = (DXPF_RGB24 | DXPF_TRANSPARENCY),
+ DXPF_RGB555_CK = (DXPF_RGB555 | DXPF_TRANSPARENCY),
+ DXPF_RGB565_CK = (DXPF_RGB565 | DXPF_TRANSPARENCY),
+ DXPF_RGB8_CK = (DXPF_RGB8 | DXPF_TRANSPARENCY)
+ } DXSAMPLEFORMATENUM;
+
+ typedef enum DXLOCKSURF
+ {
+ DXLOCKF_READ = 0,
+ DXLOCKF_READWRITE = (1 << 0),
+ DXLOCKF_EXISTINGINFOONLY = (1 << 1), // If used in conjunction with WANTRUNINFO will prevent creation of a runmap if one does not exist
+ DXLOCKF_WANTRUNINFO = (1 << 2),
+ //
+ // The flags in the high word should be specific to the type of pointer that
+ // is requested. These flags define ARGB flags. These flags are advisory and
+ // are not required to be set for ARGB locks.
+ //
+ DXLOCKF_NONPREMULT = (1 << 16), // Caller will request non-premultiplied data
+ DXLOCKF_VALIDFLAGS = (DXLOCKF_READWRITE | DXLOCKF_EXISTINGINFOONLY | DXLOCKF_WANTRUNINFO | DXLOCKF_NONPREMULT)
+ } DXLOCKSURF;
+
+ typedef enum DXSURFSTATUS
+ {
+ DXSURF_TRANSIENT = (1 << 0), // Data in this surface changes often.
+ DXSURF_READONLY = (1 << 1), // Surface is read-only
+ DXSURF_VALIDFLAGS = (DXSURF_TRANSIENT | DXSURF_READONLY)
+ } DXSURFSTATUS;
+
+ [
+ object,
+ uuid(B39FD73F-E139-11d1-9065-00C04FD9189D),
+ helpstring("IDXSurface Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXSurface : IDXBaseObject
+ {
+ HRESULT GetPixelFormat([out] GUID * pFormatID, [out] DXSAMPLEFORMATENUM *pSampleFormatEnum);
+ HRESULT GetBounds( [out]DXBNDS *pBounds );
+ HRESULT GetStatusFlags([out] DWORD * pdwStatusFlags);
+ HRESULT SetStatusFlags([in] DWORD dwStatusFlags);
+ HRESULT LockSurface( [in]const DXBNDS *pBounds, [in]ULONG ulTimeOut, [in]DWORD dwFlags,
+ [in]REFIID riid, [out, iid_is(riid)] void **ppPointer,
+ [out]ULONG* pulGenerationId );
+ HRESULT GetDirectDrawSurface( [in] REFIID riid,
+ [out, iid_is(riid)] void ** ppSurface);
+ HRESULT GetColorKey(DXSAMPLE * pColorKey); // Can return E_NOTIMPL
+ HRESULT SetColorKey(DXSAMPLE ColorKey); // Set color of 0 to get rid of color key, can return E_NOTIMPL
+ HRESULT LockSurfaceDC( [in] const DXBNDS *pBounds, [in]ULONG ulTimeOut, [in] DWORD dwFlags,
+ [out] IDXDCLock **ppDCLock);
+ HRESULT SetAppData(DWORD_PTR dwAppData);
+ HRESULT GetAppData(DWORD_PTR *pdwAppData);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXSurfaceInit
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(9EA3B639-C37D-11d1-905E-00C04FD9189D),
+ helpstring("IDXSurfaceInit Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXSurfaceInit : IUnknown
+ {
+ HRESULT InitSurface([in] IUnknown *pDirectDraw,
+ [in] const DDSURFACEDESC *pDDSurfaceDesc,
+ [in] const GUID * pFormatID,
+ [in] const DXBNDS *pBounds,
+ [in] DWORD dwFlags);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXARGBSurfaceInit
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(9EA3B63A-C37D-11d1-905E-00C04FD9189D),
+ helpstring("IDXARGBSurfaceInit Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXARGBSurfaceInit : IDXSurfaceInit
+ {
+ HRESULT InitFromDDSurface( [in] IUnknown *pDDrawSurface,
+ [in] const GUID * pFormatID,
+ [in] DWORD dwFlags);
+ HRESULT InitFromRawSurface([in] IDXRawSurface *pRawSurface);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXARGBReadPtr
+//
+//------------------------------------------------------------------------------
+
+ typedef struct tagDXNATIVETYPEINFO
+ {
+ BYTE * pCurrentData;
+ BYTE * pFirstByte;
+ long lPitch;
+ DWORD dwColorKey;
+ } DXNATIVETYPEINFO;
+
+ typedef struct tagDXPACKEDRECTDESC
+ {
+ DXBASESAMPLE *pSamples;
+ BOOL bPremult;
+ RECT rect;
+ long lRowPadding;
+ } DXPACKEDRECTDESC;
+
+ typedef struct tagDXOVERSAMPLEDESC
+ {
+ POINT p;
+ DXPMSAMPLE Color;
+ } DXOVERSAMPLEDESC;
+
+ [
+ object,
+ uuid(EAAAC2D6-C290-11d1-905D-00C04FD9189D),
+ helpstring("IDXARGBReadPtr Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXARGBReadPtr : IUnknown
+ {
+ HRESULT GetSurface( [in]REFIID riid, [out, iid_is( riid )]void ** ppSurface);
+ DXSAMPLEFORMATENUM GetNativeType( [out]DXNATIVETYPEINFO *pInfo );
+ void Move( [in]long cSamples );
+ void MoveToRow( [in]ULONG y );
+ void MoveToXY( [in]ULONG x, [in]ULONG y);
+ ULONG MoveAndGetRunInfo( [in]ULONG Row, [out] const DXRUNINFO** ppInfo ); // Returns count of runs
+ DXSAMPLE * Unpack( [in]DXSAMPLE* pSamples, [in]ULONG cSamples, [in]BOOL bMove );
+ DXPMSAMPLE * UnpackPremult( [in]DXPMSAMPLE* pSamples, [in]ULONG cSamples, [in]BOOL bMove );
+ void UnpackRect([in] const DXPACKEDRECTDESC * pRectDesc);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXARGBReadWritePtr
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(EAAAC2D7-C290-11d1-905D-00C04FD9189D),
+ helpstring("IDXARGBReadWritePtr Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXARGBReadWritePtr : IDXARGBReadPtr
+ {
+ void PackAndMove( [in]const DXSAMPLE *pSamples, [in]ULONG cSamples );
+ void PackPremultAndMove( [in]const DXPMSAMPLE *pSamples, [in]ULONG cSamples );
+ void PackRect([in]const DXPACKEDRECTDESC *pRectDesc);
+ void CopyAndMoveBoth( [in]DXBASESAMPLE *pScratchBuffer, [in]IDXARGBReadPtr *pSrc,
+ [in]ULONG cSamples, [in]BOOL bIsOpaque );
+ void CopyRect( [in] DXBASESAMPLE *pScratchBuffer,
+ [in] const RECT *pDestRect, [in]IDXARGBReadPtr *pSrc,
+ [in] const POINT *pSrcOrigin, [in]BOOL bIsOpaque);
+ void FillAndMove( [in]DXBASESAMPLE *pScratchBuffer, [in]DXPMSAMPLE SampVal,
+ [in]ULONG cSamples, [in]BOOL bDoOver );
+ void FillRect( [in]const RECT *pRect, [in]DXPMSAMPLE SampVal, [in]BOOL bDoOver );
+ void OverSample( [in]const DXOVERSAMPLEDESC * pOverDesc);
+ void OverArrayAndMove([in]DXBASESAMPLE *pScratchBuffer,
+ [in] const DXPMSAMPLE *pSrc,
+ [in] ULONG cSamples);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXDCLock
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(0F619456-CF39-11d1-905E-00C04FD9189D),
+ helpstring("IDXDCLock Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXDCLock : IUnknown
+ {
+ HDC GetDC(void);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXTScaleOutput
+//
+// Overview:
+// Generic interface that any transform can support which allows caller to
+// specify the desired output bounds.
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(B2024B50-EE77-11d1-9066-00C04FD9189D),
+ helpstring("IDXTScaleOutput Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXTScaleOutput : IUnknown
+ {
+ HRESULT SetOutputSize([in] const SIZE OutSize, [in] BOOL bMaintainAspect);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXGradient
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(B2024B51-EE77-11d1-9066-00C04FD9189D),
+ helpstring("IDXGradient Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXGradient : IDXTScaleOutput
+ {
+ HRESULT SetGradient(DXSAMPLE StartColor, DXSAMPLE EndColor, BOOL bHorizontal);
+ HRESULT GetOutputSize([out] SIZE *pOutSize);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXTScale
+//
+// Overview:
+// This is the control interface for the simple scale transform.
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(B39FD742-E139-11d1-9065-00C04FD9189D),
+ helpstring("IDXTScale Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXTScale : IUnknown
+ {
+ HRESULT SetScales( [in]float Scales[2] );
+ HRESULT GetScales( [out]float Scales[2] );
+ HRESULT ScaleFitToSize( [in,out]DXBNDS* pClipBounds,
+ [in]SIZE FitToSize, [in]BOOL bMaintainAspect );
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXEffect
+//
+// Overview:
+// This interface is used to generically control transforms that are
+// transition effects.
+//
+//------------------------------------------------------------------------------
+
+ typedef enum DISPIDDXEFFECT
+ {
+ DISPID_DXECAPABILITIES = 10000, // Start at 10000 to avoid conflicts with inhereted interfaces
+ DISPID_DXEPROGRESS,
+ DISPID_DXESTEP,
+ DISPID_DXEDURATION,
+ DISPID_DXE_NEXT_ID
+ } DISPIDDXBOUNDEDEFFECT;
+
+ typedef enum DXEFFECTTYPE
+ {
+ DXTET_PERIODIC = (1 << 0), // Result at 1 is same as result at 0
+ DXTET_MORPH = (1 << 1) // Transition between 2 inputs (input 0 to input 1)
+ } DXEFFECTTYPE;
+
+ [
+ object,
+ uuid(E31FB81B-1335-11d1-8189-0000F87557DB),
+ helpstring("IDXEffect Interface"),
+ pointer_default(unique),
+ dual
+ ]
+ interface IDXEffect : IDispatch
+ {
+ [propget, id(DISPID_DXECAPABILITIES)]
+ HRESULT Capabilities([out, retval] long *pVal);
+ [propget, id(DISPID_DXEPROGRESS)]
+ HRESULT Progress([out, retval] float *pVal);
+ [propput, id(DISPID_DXEPROGRESS)]
+ HRESULT Progress([in] float newVal);
+ [propget, id(DISPID_DXESTEP)]
+ HRESULT StepResolution([out, retval] float *pVal);
+ [propget, id(DISPID_DXEDURATION)]
+ HRESULT Duration([out, retval] float *pVal);
+ [propput, id(DISPID_DXEDURATION)]
+ HRESULT Duration([in] float newVal);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXLookupTable
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(01BAFC7F-9E63-11d1-9053-00C04FD9189D),
+ helpstring("IDXLookupTable Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXLookupTable : IDXBaseObject
+ {
+ HRESULT GetTables( [out]BYTE RedLUT[256],
+ [out]BYTE GreenLUT[256],
+ [out]BYTE BlueLUT[256],
+ [out]BYTE AlphaLUT[256] );
+
+ HRESULT IsChannelIdentity([out] DXBASESAMPLE * pSampleBools);
+ HRESULT GetIndexValues([in] ULONG Index, [out] DXBASESAMPLE *pSample);
+ HRESULT ApplyTables([in, out] DXSAMPLE *pSamples, [in] ULONG cSamples);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IDXRawSurface
+//
+// Overview:
+// User created objects support IDXRawSurface
+//
+//------------------------------------------------------------------------------
+
+ typedef struct DXRAWSURFACEINFO
+ {
+ BYTE * pFirstByte;
+ long lPitch;
+ ULONG Width;
+ ULONG Height;
+ const GUID * pPixelFormat;
+ HDC hdc;
+ DWORD dwColorKey; // Note: High byte must == 0xFF for color keyed surface. Low 3 bytes are native data type.
+ DXBASESAMPLE * pPalette;
+ } DXRAWSURFACEINFO;
+
+ [
+ object,
+ uuid(09756C8A-D96A-11d1-9062-00C04FD9189D),
+ helpstring("IDXRawSurface Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IDXRawSurface : IUnknown
+ {
+ HRESULT GetSurfaceInfo(DXRAWSURFACEINFO * pSurfaceInfo);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// IHTMLDXTransform
+//
+//------------------------------------------------------------------------------
+
+ [
+ object,
+ uuid(30E2AB7D-4FDD-4159-B7EA-DC722BF4ADE5),
+ helpstring("IHTMLDXTransform Interface"),
+ pointer_default(unique),
+ local
+ ]
+ interface IHTMLDXTransform : IUnknown
+ {
+ HRESULT SetHostUrl(BSTR bstrHostUrl);
+ };
+
+
+//+-----------------------------------------------------------------------------
+//
+// ICSSFilterDispatch
+//
+//------------------------------------------------------------------------------
+
+ typedef enum DXTFILTER_STATUS
+ {
+ DXTFILTER_STATUS_Stopped = 0,
+ DXTFILTER_STATUS_Applied,
+ DXTFILTER_STATUS_Playing,
+ DXTFILTER_STATUS_MAX
+ } DXTFILTER_STATUS;
+
+ typedef enum DXTFILTER_DISPID
+ {
+ DISPID_DXTFilter_Percent = 1,
+ DISPID_DXTFilter_Duration,
+ DISPID_DXTFilter_Enabled,
+ DISPID_DXTFilter_Status,
+ DISPID_DXTFilter_Apply,
+ DISPID_DXTFilter_Play,
+ DISPID_DXTFilter_Stop,
+ DISPID_DXTFilter_MAX
+ } DXTFILTER_DISPID;
+
+ [
+ object,
+ uuid(9519152B-9484-4A6C-B6A7-4F25E92D6C6B),
+ helpstring("ICSSFilterDispatch Interface"),
+ pointer_default(unique),
+ dual
+ ]
+ interface ICSSFilterDispatch : IDispatch
+ {
+ [propget, id(DISPID_DXTFilter_Percent)] HRESULT Percent( [out, retval] float *pVal);
+ [propput, id(DISPID_DXTFilter_Percent)] HRESULT Percent( [in] float newVal);
+ [propget, id(DISPID_DXTFilter_Duration)] HRESULT Duration([out, retval] float *pVal);
+ [propput, id(DISPID_DXTFilter_Duration)] HRESULT Duration([in] float newVal);
+ [propget, id(DISPID_DXTFilter_Enabled)] HRESULT Enabled( [out, retval] VARIANT_BOOL *pfVal);
+ [propput, id(DISPID_DXTFilter_Enabled)] HRESULT Enabled( [in] VARIANT_BOOL fVal);
+ [propget, id(DISPID_DXTFilter_Status)] HRESULT Status( [out, retval] DXTFILTER_STATUS * peVal);
+ [id(DISPID_DXTFilter_Apply)] HRESULT Apply();
+ [id(DISPID_DXTFilter_Play)] HRESULT Play([in, optional] VARIANT varDuration);
+ [id(DISPID_DXTFilter_Stop)] HRESULT Stop();
+ };
+
+
+//=== CoClass definitions =================================================
+
+[
+ uuid(54314D1D-35FE-11d1-81A1-0000F87557DB),
+ version(1.1),
+ helpstring("Microsoft DirectX Transforms Core Type Library")
+]
+library DXTRANSLib
+{
+ importlib("stdole2.tlb");
+
+ ///////////////////////////////
+ // DXTransformFactory CoClass
+ ///////////////////////////////
+ [
+ uuid(D1FE6762-FC48-11D0-883A-3C8B00C10000),
+ helpstring("DXTransformFactory Class")
+ ]
+ coclass DXTransformFactory
+ {
+ [default] interface IDXTransformFactory;
+ interface IDXSurfaceFactory;
+ };
+
+
+ ///////////////////////////////
+ // DXTaskManager CoClass
+ ///////////////////////////////
+ [
+ uuid(4CB26C03-FF93-11d0-817E-0000F87557DB),
+ helpstring("DXTaskManager Class")
+ ]
+ coclass DXTaskManager
+ {
+ [default] interface IDXTaskManager;
+ };
+
+
+ ///////////////////////////////
+ // DXTScale CoClass
+ ///////////////////////////////
+ [
+ uuid(555278E2-05DB-11D1-883A-3C8B00C10000),
+ helpstring("DXTScale Class")
+ ]
+ coclass DXTScale
+ {
+ [default] interface IDXTScale;
+ };
+
+
+ ///////////////////////////////
+ // DXSurface CoClass
+ ///////////////////////////////
+ [
+ uuid(0E890F83-5F79-11D1-9043-00C04FD9189D),
+ helpstring("DXSurface Class")
+ ]
+ coclass DXSurface
+ {
+ [default] interface IDXSurface;
+ };
+
+
+ ///////////////////////////////
+ // DXSurfaceModifier CoClass
+ ///////////////////////////////
+ [
+ uuid(3E669F1D-9C23-11d1-9053-00C04FD9189D),
+ helpstring("DXSurfaceModifier Class")
+ ]
+ coclass DXSurfaceModifier
+ {
+ [default] interface IDXSurfaceModifier;
+ };
+
+
+ ///////////////////////////////
+ // DXGradient CoClass
+ ///////////////////////////////
+ [
+ uuid(C6365470-F667-11d1-9067-00C04FD9189D),
+ helpstring("DXGradient Class")
+ ]
+ coclass DXGradient
+ {
+ [default] interface IDXGradient;
+ };
+
+
+ ///////////////////////////////
+ // DXTFilter CoClass
+ ///////////////////////////////
+ [
+ uuid(385A91BC-1E8A-4e4a-A7A6-F4FC1E6CA1BD),
+ helpstring("DXTFilter Class")
+ ]
+ coclass DXTFilter
+ {
+ [default] interface ICSSFilterDispatch;
+ };
+};
diff --git a/dxsdk/Include/DShowIDL/dyngraph.idl b/dxsdk/Include/DShowIDL/dyngraph.idl
new file mode 100644
index 00000000..569def6e
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/dyngraph.idl
@@ -0,0 +1,318 @@
+//------------------------------------------------------------------------------
+// File: DynGraph.idl
+//
+// Desc: Dynamic graph interfaces
+//
+// Copyright (c) 1999-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+interface IPinConnection;
+interface IPinFlowControl;
+interface IGraphConfig;
+interface IGraphConfigCallback;
+
+//--------------------------------------------------------------------
+//
+// IPinConnection - supported by input pins
+//
+//--------------------------------------------------------------------
+[
+ local,
+ object,
+ uuid(4a9a62d3-27d4-403d-91e9-89f540e55534),
+ pointer_default(unique)
+]
+interface IPinConnection : IUnknown {
+
+ // Do you accept this type chane in your current state?
+ HRESULT DynamicQueryAccept([in] const AM_MEDIA_TYPE *pmt);
+
+ // Set event when EndOfStream receive - do NOT pass it on
+ // This condition is cancelled by a flush or Stop
+ HRESULT NotifyEndOfStream([in] HANDLE hNotifyEvent);
+
+ // Are you an 'end pin'
+ HRESULT IsEndPin();
+
+ HRESULT DynamicDisconnect();
+};
+
+//--------------------------------------------------------------------
+//
+// IPinFlowControl - supported by output pins
+//
+//--------------------------------------------------------------------
+[
+ local,
+ object,
+ uuid(c56e9858-dbf3-4f6b-8119-384af2060deb),
+ pointer_default(unique)
+]
+interface IPinFlowControl : IUnknown {
+ // Block processing on this pin
+ HRESULT Block([in] DWORD dwBlockFlags, [in] HANDLE hEvent);
+}
+
+// block flags
+enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS {
+ AM_PIN_FLOW_CONTROL_BLOCK = 0x00000001, // 0 means unblock
+};
+
+
+// Reconnect flags
+typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS {
+ AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x00000001,
+ AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x00000002,
+ AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x00000004
+} AM_GRAPH_CONFIG_RECONNECT_FLAGS;
+
+// RemoveFilterEx flags
+enum _REM_FILTER_FLAGS {
+ REMFILTERF_LEAVECONNECTED = 0x00000001
+};
+
+typedef enum _AM_FILTER_FLAGS {
+ AM_FILTER_FLAGS_REMOVABLE = 0x00000001
+ } AM_FILTER_FLAGS;
+
+
+//--------------------------------------------------------------------
+//
+// IGraphConfig
+//
+//--------------------------------------------------------------------
+
+[
+ local,
+ object,
+ uuid(03A1EB8E-32BF-4245-8502-114D08A9CB88),
+ pointer_default(unique)
+]
+interface IGraphConfig : IUnknown {
+ HRESULT Reconnect([in] IPin *pOutputPin,
+ [in] IPin *pInputPin,
+ [in] const AM_MEDIA_TYPE *pmtFirstConnection,
+ [in] IBaseFilter *pUsingFilter, // can be NULL
+ [in] HANDLE hAbortEvent,
+ [in] DWORD dwFlags);
+
+ HRESULT Reconfigure([in] IGraphConfigCallback *pCallback,
+ [in] PVOID pvContext,
+ [in] DWORD dwFlags,
+ [in] HANDLE hAbortEvent);
+
+
+ HRESULT AddFilterToCache([in] IBaseFilter *pFilter);
+ HRESULT EnumCacheFilter([out] IEnumFilters **pEnum);
+ HRESULT RemoveFilterFromCache([in]IBaseFilter *pFilter);
+
+ // Get the start time associated with the last Run() call
+ // If the graph is not running returns VFW_E_WRONG_STATE
+ HRESULT GetStartTime([out] REFERENCE_TIME *prtStart);
+
+ HRESULT PushThroughData(
+ [in] IPin *pOutputPin,
+ [in] IPinConnection *pConnection,
+ [in] HANDLE hEventAbort);
+
+ HRESULT SetFilterFlags([in] IBaseFilter *pFilter, [in] DWORD dwFlags);
+ HRESULT GetFilterFlags([in] IBaseFilter *pFilter, [out] DWORD *pdwFlags);
+
+ HRESULT RemoveFilterEx( [in] IBaseFilter *pFilter, DWORD Flags );
+}
+
+//--------------------------------------------------------------------
+//
+// IGraphConfigCallback
+//
+//--------------------------------------------------------------------
+
+[
+ local,
+ object,
+ uuid(ade0fd60-d19d-11d2-abf6-00a0c905f375),
+ pointer_default(unique)
+]
+interface IGraphConfigCallback : IUnknown
+{
+ HRESULT Reconfigure(PVOID pvContext, DWORD dwFlags);
+}
+
+// Filter Chain Definition
+//
+// Filter chains have the following properties:
+//
+// - Each filter chain has one or more filters.
+//
+// - Each filter in a filter chain has at most one connected input pin and one
+// connected output pin. For example, filters A, C, D, F, G, H, I, J and K
+// (see the diagram below) can be in a filter chain because each one has at
+// most one connected input pin and one connected output pin.
+//
+// - Any filter in a chain is reachable by any other filter in the chain.
+// For example, in the filter chain F-G-H, F can reach H by following the F-
+// G connection to G and then following the G-H connection to H. Filters F
+// and J cannot be in the same filter chain because J is not reachable from
+// F. Anotherwords, there no sequence of connected filters between F and J.
+//
+// - The start filter is the only filter in the filter chain who's input
+// pin is not connected to another filter in the chain. For instance, F is
+// the start filter in F-G-H because F's input pin is connected to E and E
+// is not in the filter chain. G's input pin is connected to F and H's is
+// connected to G. Both F and G are in the filter chain.
+//
+// - The end filter is the only filter in the filter chain who's output pin
+// is not connected to another filter in the chain. For example, in the
+// filter chain J-K, K is the end filter because K's output pin is
+// connected to L. J's output pin is connected to K and K is in the J-K
+// filter chain.
+//
+//
+// --->|---| |---|--->
+// | C |--->| D |
+// |---| |---|--->|---| |---|--->|---| |---| |---| |---|
+// | A |--->| B | | E |--->| F |--->| G |--->| H |
+// |---| |---|--->|---|------------>|---| |---| |---| |---|
+// | I |--->
+// --->|---|--->
+//
+// |---| |---| |---|
+// | J |--->| K |--->| L |
+// |---| |---| |---|
+//
+// Example Filter Graph
+//
+//
+//
+// IFilterChain Methods Documentation
+//
+// HRESULT StartChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+//
+// StartChain() switches all the filters in the chain into the running state
+// If one of the filters will not switch to the running state, then all the filters
+// in the chain are stopped. This method can only be called if the filter graph is
+// running.
+//
+// Parameters:
+// - pStartFilter [in]
+// The first filter in the filter chain. Note that this can be the same
+// filter as pEndFilter .
+//
+// - pEndFilter [in]
+// The last filter in the filter chain. Note that this can be the same
+// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends
+// from pStartFilter to the last downstream filter which can be in a filter chain.
+// For example, IFilterChain::StartChain( A, NULL ) would start filter A.
+// IFilterChain::StartChain( G, NULL ) would start filters G and H.
+// IFilterChain::StartChain( C, NULL ) would start filters C and D. Finally,
+// IFilterChain::StartChain( E, NULL ) would fail because E cannot be in a
+// filter chain (see the Filter Chain Definition section for more information).
+//
+// Return Value:
+// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
+// information on interpreting HRESULTs.
+//
+//
+//
+//
+// HRESULT PauseChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+//
+// PauseChain() switches all the filters in a chain to the paused state. If it cannot
+// switch one of the filtres into the paused state, all the filters in the chain are
+// stopped. This method can only be called if the filter graph is paused.
+//
+// Parameters:
+// - pStartFilter [in]
+// The first filter in the filter chain. Note that this can be the same
+// filter as pEndFilter .
+//
+// - pEndFilter [in]
+// The last filter in the filter chain. Note that this can be the same
+// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends
+// from pStartFilter to the last downstream filter which can be in a filter chain.
+// For example, IFilterChain::StopChain( A, NULL ) would stop filter A.
+// IFilterChain::StopChain( G, NULL ) would stop filters G and H.
+// IFilterChain::StopChain( C, NULL ) would stop filters C and D. Finally,
+// IFilterChain::StopChain( E, NULL ) would fail because E cannot be in a filter
+// chain (see the Filter Chain Definition section for more information).
+//
+//
+// Return Value:
+// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
+// information on interpreting HRESULTs.
+//
+//
+//
+// HRESULT StopChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+//
+// StopChain() switches all the filters in chain to the stopped state.
+//
+// Parameters:
+// - pStartFilter [in]
+// The first filter in the filter chain. Note that this can be the same
+// filter as pEndFilter .
+//
+// - pEndFilter [in]
+// The last filter in the filter chain. Note that this can be the same
+// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends
+// from pStartFilter to the last downstream filter which can be in a filter chain.
+// For example, IFilterChain::StopChain( A, NULL ) would stop filter A.
+// IFilterChain::StopChain( G, NULL ) would stop filters G and H.
+// IFilterChain::StopChain( C, NULL ) would stop filters C and D. Finally,
+// IFilterChain::StopChain( E, NULL ) would fail because E cannot be in a filter
+// chain (see the Filter Chain Definition section for more information).
+//
+//
+// Return Value:
+// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
+// information on interpreting HRESULTs.
+//
+//
+//
+//
+//
+// HRESULT RemoveChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+//
+// RemoveChain() removes every filter in a chain from the filter graph.
+// The filters can be removed while the graph is running.
+//
+// Parameters:
+// - pStartFilter [in]
+// The first filter in the filter chain. Note that this can be the same
+// filter as pEndFilter .
+//
+// - pEndFilter [in]
+// The last filter in the filter chain. Note that this can be the same
+// filter as pStartFilter. If pEndFilter is NULL then the filter chain
+// extends from pStartFilter to the last downstream filter which can be in a
+// filter chain. For example, IFilterChain::RemoveChain( A, NULL ) would remove
+// filter A from the filter graph. IFilterChain::RemoveChain( G, NULL ) would
+// remove filters G and H. IFilterChain::RemoveChain( C, NULL ) would remove
+// filters C and D. Finally, IFilterChain::RemoveChain( E, NULL ) would fail
+// because E cannot be in a filter chain (see the Filter Chain Definition
+// section for more information).
+//
+//
+// Return Value:
+// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
+// information on interpreting HRESULTs.
+//
+//
+[
+ local,
+ object,
+ uuid(DCFBDCF6-0DC2-45f5-9AB2-7C330EA09C29),
+ pointer_default(unique)
+]
+interface IFilterChain : IUnknown
+{
+ HRESULT StartChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+ HRESULT PauseChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+ HRESULT StopChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+ HRESULT RemoveChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
+}
+
+
+
+
diff --git a/dxsdk/Include/DShowIDL/mediaobj.idl b/dxsdk/Include/DShowIDL/mediaobj.idl
new file mode 100644
index 00000000..6852ced9
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/mediaobj.idl
@@ -0,0 +1,411 @@
+//------------------------------------------------------------------------------
+// File: MediaObj.idl
+//
+// Desc: Define the interfaces for DirectX Media Objects. This file will be
+// processed by the MIDL tool to produce mediaobj.h and proxy-stub code.
+//
+// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+import "objidl.idl";
+
+// DMO_MEDIA_TYPE structure
+
+cpp_quote("#ifdef __strmif_h__")
+cpp_quote("typedef AM_MEDIA_TYPE DMO_MEDIA_TYPE;")
+cpp_quote("#else")
+typedef struct _DMOMediaType {
+ GUID majortype;
+ GUID subtype;
+ BOOL bFixedSizeSamples;
+ BOOL bTemporalCompression;
+ ULONG lSampleSize;
+ GUID formattype;
+ IUnknown *pUnk;
+ ULONG cbFormat;
+ [size_is(cbFormat)] BYTE * pbFormat;
+} DMO_MEDIA_TYPE;
+typedef LONGLONG REFERENCE_TIME;
+cpp_quote("#endif")
+
+
+// Per-buffer flags that apply to input buffers
+enum _DMO_INPUT_DATA_BUFFER_FLAGS {
+ DMO_INPUT_DATA_BUFFERF_SYNCPOINT = 0x00000001,
+ DMO_INPUT_DATA_BUFFERF_TIME = 0x00000002,
+ DMO_INPUT_DATA_BUFFERF_TIMELENGTH = 0x00000004
+};
+
+// Per-buffer flags that apply to output buffers.
+enum _DMO_OUTPUT_DATA_BUFFER_FLAGS {
+ DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT = 0x00000001,
+ DMO_OUTPUT_DATA_BUFFERF_TIME = 0x00000002,
+ DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH = 0x00000004,
+
+ //
+ // This flag means the object could have generated more data for this
+ // output stream, even with no additional input from any input stream,
+ // but the output buffer did not have sufficient room.
+ //
+ DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE = 0x01000000
+};
+
+// Flags returned by GetInputStatus()
+enum _DMO_INPUT_STATUS_FLAGS {
+ //
+ // ACCEPT_DATA indicates that the input stream is ready to accept
+ // new data via ProcessInput().
+ //
+ DMO_INPUT_STATUSF_ACCEPT_DATA = 0x00000001
+};
+
+// Flags returned by GetInputStreamInfo()
+enum _DMO_INPUT_STREAM_INFO_FLAGS {
+ DMO_INPUT_STREAMF_WHOLE_SAMPLES = 0x00000001,
+ DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER = 0x00000002,
+ DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE = 0x00000004,
+ DMO_INPUT_STREAMF_HOLDS_BUFFERS = 0x00000008
+};
+
+// Flags returned by GetOutputStreamInfo()
+enum _DMO_OUTPUT_STREAM_INFO_FLAGS {
+ DMO_OUTPUT_STREAMF_WHOLE_SAMPLES = 0x00000001,
+ DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER = 0x00000002,
+ DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE = 0x00000004,
+ DMO_OUTPUT_STREAMF_DISCARDABLE = 0x00000008,
+ DMO_OUTPUT_STREAMF_OPTIONAL = 0x00000010
+};
+
+// SetType flags
+enum _DMO_SET_TYPE_FLAGS {
+ DMO_SET_TYPEF_TEST_ONLY = 0x00000001,// check but don't set
+ DMO_SET_TYPEF_CLEAR = 0x00000002 // unset
+};
+
+// Process Output Flags
+enum _DMO_PROCESS_OUTPUT_FLAGS {
+ DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER = 0x00000001 // Discard
+};
+
+// Buffer wrapper interface
+[
+ object,
+ uuid(59eff8b9-938c-4a26-82f2-95cb84cdc837)
+]
+interface IMediaBuffer : IUnknown
+{
+ HRESULT SetLength(
+ DWORD cbLength
+ );
+ HRESULT GetMaxLength(
+ [out] DWORD *pcbMaxLength
+ );
+ HRESULT GetBufferAndLength(
+ [out] BYTE **ppBuffer, // not filled if NULL
+ [out] DWORD *pcbLength // not filled if NULL
+ );
+}
+
+//
+// Output buffer info structure: one of these must be passed in for each
+// output stream with every ProcessOutput() call
+// All [out] fields should be
+// assumed undefined if ProcessOutput() failed
+//
+typedef struct _DMO_OUTPUT_DATA_BUFFER {
+
+ IMediaBuffer *pBuffer; // [in] can be NULL
+
+ // ProcessOutput() must set any appropriate flags and zero out the rest.
+ DWORD dwStatus; // [out] DMO_OUTPUT_DATA_BUFFERF_XXX (INCOMPLETE, etc.)
+
+ //
+ // Each of these is valid if the corresponding flag is set in dwStatus
+ //
+ REFERENCE_TIME rtTimestamp; // [out]
+ REFERENCE_TIME rtTimelength; // [out]
+} DMO_OUTPUT_DATA_BUFFER, *PDMO_OUTPUT_DATA_BUFFER;
+
+
+// Interface supported by media objects
+[
+ object,
+ uuid(d8ad0f58-5494-4102-97c5-ec798e59bcf4)
+]
+interface IMediaObject : IUnknown
+{
+
+//
+// Stream enumeration
+//
+ HRESULT GetStreamCount(
+ [out] DWORD *pcInputStreams,
+ [out] DWORD *pcOutputStreams
+ );
+ HRESULT GetInputStreamInfo(
+ DWORD dwInputStreamIndex, // 0-based
+ [out] DWORD *pdwFlags // HOLDS_BUFFERS
+ );
+ HRESULT GetOutputStreamInfo(
+ DWORD dwOutputStreamIndex, // 0-based
+ [out] DWORD *pdwFlags // Media object sets to 0
+ );
+
+//
+// Mediatypes
+//
+ //
+ // GetType - iterate through media types supported by a stream.
+ // Returns S_FALSE if the type index is out of range ("no more types").
+ //
+ HRESULT GetInputType(
+ DWORD dwInputStreamIndex,
+ DWORD dwTypeIndex, // 0-based
+ [out] DMO_MEDIA_TYPE *pmt
+ );
+ HRESULT GetOutputType(
+ DWORD dwOutputStreamIndex,
+ DWORD dwTypeIndex, // 0-based
+ [out] DMO_MEDIA_TYPE *pmt
+ );
+
+ //
+ // SetType - tell the object the type of data it will work with.
+ //
+ HRESULT SetInputType(
+ DWORD dwInputStreamIndex,
+ [in] const DMO_MEDIA_TYPE *pmt,
+ DWORD dwFlags // test only
+ );
+ HRESULT SetOutputType(
+ DWORD dwOutputStreamIndex,
+ [in] const DMO_MEDIA_TYPE *pmt,
+ DWORD dwFlags // test only
+ );
+
+ //
+ // GetCurrentType - get the last mediatype supplied via SetType.
+ // Returns S_FALSE if SetType has not been called.
+ //
+ HRESULT GetInputCurrentType(
+ DWORD dwInputStreamIndex,
+ [out] DMO_MEDIA_TYPE *pmt
+ );
+ HRESULT GetOutputCurrentType(
+ DWORD dwOutputStreamIndex,
+ [out] DMO_MEDIA_TYPE *pmt
+ );
+
+//
+// SizeInfo
+//
+ //
+ // GetSizeInfo - Get buffer size requirementes of a stream.
+ //
+ // If buffer size depends on the media type used, the object should
+ // base its response on the most recent media type set for this stream.
+ // If no mediatype has been set, the object may return an error.
+ //
+ HRESULT GetInputSizeInfo(
+ DWORD dwInputStreamIndex,
+ [out] DWORD *pcbSize, // size of input 'quantum'
+ [out] DWORD *pcbMaxLookahead, // max total bytes held
+ [out] DWORD *pcbAlignment // buffer alignment requirement
+ );
+ HRESULT GetOutputSizeInfo(
+ DWORD dwOutputStreamIndex,
+ [out] DWORD *pcbSize, // size of output 'quantum'
+ [out] DWORD *pcbAlignment // buffer alignment requirement
+ );
+
+//
+// Latency methods
+//
+ HRESULT GetInputMaxLatency(
+ DWORD dwInputStreamIndex,
+ [out] REFERENCE_TIME *prtMaxLatency
+ );
+ HRESULT SetInputMaxLatency(
+ DWORD dwInputStreamIndex,
+ REFERENCE_TIME rtMaxLatency
+ );
+
+//
+// Streaming / state methods
+//
+ //
+ // Flush() - discard any buffered data.
+ //
+ HRESULT Flush();
+
+ //
+ // Send a discontinuity to an input stream. The object will not
+ // accept any more data on this input stream until the discontinuity
+ // has been completely processed, which may involve multiple
+ // ProcessOutput() calls.
+ //
+ HRESULT Discontinuity(DWORD dwInputStreamIndex);
+
+ //
+ // If a streaming object needs to perform any time consuming
+ // initialization before it can stream data, it should do it inside
+ // AllocateStreamingResources() rather than during the first process
+ // call.
+ //
+ // This method is NOT guaranteed to be called before streaming
+ // starts. If it is not called, the object should perform any
+ // required initialization during a process call.
+ //
+ HRESULT AllocateStreamingResources();
+
+ // Free anything allocated in AllocateStreamingResources().
+ HRESULT FreeStreamingResources();
+
+ // GetInputStatus - the only flag defined right now is ACCEPT_DATA.
+ HRESULT GetInputStatus(
+ DWORD dwInputStreamIndex,
+ [out] DWORD *dwFlags // ACCEPT_DATA
+ );
+
+ //
+ // Pass one new buffer to an input stream
+ //
+ HRESULT ProcessInput(
+ DWORD dwInputStreamIndex,
+ IMediaBuffer *pBuffer, // must not be NULL
+ DWORD dwFlags, // DMO_INPUT_DATA_BUFFERF_XXX (syncpoint, etc.)
+ REFERENCE_TIME rtTimestamp, // valid if flag set
+ REFERENCE_TIME rtTimelength // valid if flag set
+ );
+
+ //
+ // ProcessOutput() - generate output for current input buffers
+ //
+ // Output stream specific status information is returned in the
+ // dwStatus member of each buffer wrapper structure.
+ //
+ HRESULT ProcessOutput(
+ DWORD dwFlags, // DMO_PROCESS_OUTPUT_FLAGS
+ DWORD cOutputBufferCount, // # returned by GetStreamCount()
+ [in,out,size_is(cOutputBufferCount)]
+ DMO_OUTPUT_DATA_BUFFER *pOutputBuffers, // one per stream
+ [out] DWORD *pdwStatus // TBD, must be set to 0
+ );
+
+ // Locking - lock if bLock is TRUE, otherwise unlock
+ HRESULT Lock(LONG bLock);
+};
+
+
+//
+// Interface returned by the DMO enumeration API
+//
+[
+object,
+uuid(2c3cd98a-2bfa-4a53-9c27-5249ba64ba0f)
+]
+interface IEnumDMO : IUnknown {
+ HRESULT Next(
+ DWORD cItemsToFetch,
+ [out, size_is(cItemsToFetch), length_is(*pcItemsFetched)] CLSID *pCLSID,
+ [out, size_is(cItemsToFetch), length_is(*pcItemsFetched), string] WCHAR **Names,
+ [out] DWORD *pcItemsFetched
+ );
+ HRESULT Skip(
+ DWORD cItemsToSkip
+ );
+ HRESULT Reset(void);
+ HRESULT Clone(
+ [out] IEnumDMO **ppEnum
+ );
+}
+
+
+// Flags for IMediaObjectInPlace::Process
+enum _DMO_INPLACE_PROCESS_FLAGS {
+ DMO_INPLACE_NORMAL = 0x00000000,
+ DMO_INPLACE_ZERO = 0x00000001
+};
+
+[
+object,
+uuid(651b9ad0-0fc7-4aa9-9538-d89931010741)
+]
+interface IMediaObjectInPlace : IUnknown {
+
+ // Proces - Given a buffer of size ulSize, put the output
+ // of the DMO into the same buffer.
+ HRESULT Process(
+ [in] ULONG ulSize,
+ [in,out,size_is(ulSize)] BYTE* pData,
+ [in] REFERENCE_TIME refTimeStart,
+ [in] DWORD dwFlags
+ );
+
+ // Create a copy of the In-Place Media Object. This allows
+ // for very fast initialization of a number of In-Place objects
+ // in a known state.
+ HRESULT Clone(
+ [out] IMediaObjectInPlace **ppMediaObject
+ );
+
+ // GetLatency - Returns a REFERENCE_TIME value
+ // (1 tick = 100ns) which corresponds to the latency time
+ // processing this effect will add to the graph. This assumes
+ // the effect cost per buffer is a constant.
+ HRESULT GetLatency(
+ [out] REFERENCE_TIME *pLatencyTime
+ );
+}
+
+// Quality control status flags
+enum _DMO_QUALITY_STATUS_FLAGS {
+ DMO_QUALITY_STATUS_ENABLED = 0x00000001
+};
+
+[
+object,
+uuid(65abea96-cf36-453f-af8a-705e98f16260)
+]
+interface IDMOQualityControl : IUnknown {
+ HRESULT SetNow(
+ [in] REFERENCE_TIME rtNow
+ );
+ HRESULT SetStatus(
+ [in] DWORD dwFlags
+ );
+ HRESULT GetStatus(
+ [out] DWORD *pdwFlags
+ );
+}
+
+// Flags for IVideoOutputOptimizations
+enum _DMO_VIDEO_OUTPUT_STREAM_FLAGS {
+ DMO_VOSF_NEEDS_PREVIOUS_SAMPLE = 0x00000001
+};
+
+[
+object,
+uuid(be8f4f4e-5b16-4d29-b350-7f6b5d9298ac)
+]
+interface IDMOVideoOutputOptimizations : IUnknown {
+ HRESULT QueryOperationModePreferences (
+ ULONG ulOutputStreamIndex,
+ DWORD *pdwRequestedCapabilities
+ );
+ HRESULT SetOperationMode (
+ ULONG ulOutputStreamIndex,
+ DWORD dwEnabledFeatures
+ );
+ HRESULT GetCurrentOperationMode (
+ ULONG ulOutputStreamIndex,
+ DWORD *pdwEnabledFeatures
+ );
+ HRESULT GetCurrentSampleRequirements (
+ ULONG ulOutputStreamIndex,
+ DWORD *pdwRequestedFeatures
+ );
+}
+
diff --git a/dxsdk/Include/DShowIDL/medparam.idl b/dxsdk/Include/DShowIDL/medparam.idl
new file mode 100644
index 00000000..b45eab97
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/medparam.idl
@@ -0,0 +1,228 @@
+//------------------------------------------------------------------------------
+// File: MedParam.idl
+//
+// Desc: Definition of the IMediaParams and associated interfaces. These
+// interfaces are designed to allow communication of curve-following
+// behaviors for parameters of objects which require dynamic changes
+// to their parameters at run time. All changes are specified by
+// timestamp and curve type to ensure the parameters can be set
+// at sufficient accuracy with predictable behavior on subsequent
+// playback of the same curves.
+//
+// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "oaidl.idl";
+import "ocidl.idl";
+import "strmif.idl";
+
+
+//------------------------------------------------------------------------------
+// Define the semantic type to be used for each parameter. All values passed
+// into this interface are 32-bit floats, but the interface can specify that
+// the values must be integer, booleans, or enumerated types
+//------------------------------------------------------------------------------
+typedef float MP_DATA; // All data is 32-bit floats
+
+typedef enum _MP_Type {
+ MPT_INT, // data is signed 23 bit integer (mantissa)
+ MPT_FLOAT, // data is 32bit IEEE float
+ MPT_BOOL, // data is true or false (using ANSI C++ definition)
+ MPT_ENUM, // data is a set (represented by consecutive integers)
+ MPT_MAX,
+} MP_TYPE;
+
+const MP_DATA MPBOOL_TRUE = 1.0; // Value of true
+const MP_DATA MPBOOL_FALSE = 0.0; // Value of false
+
+
+//------------------------------------------------------------------------------
+// Define the types of curves which are supported
+//------------------------------------------------------------------------------
+typedef enum _MP_CURVE_TYPE {
+ MP_CURVE_JUMP = 0x0001, // No interpolation, just jump to next point
+ MP_CURVE_LINEAR = 0x0002, // Linear interpolation (y follows x from 0.0 to 1.0)
+ MP_CURVE_SQUARE = 0x0004, // y follow x^2 from 0.0 to 1.0
+ MP_CURVE_INVSQUARE = 0x0008, // y follows 1-(x^2) from 0.0 to 1.0
+ MP_CURVE_SINE = 0x0010, // y follows sin(x) from -pi/2 to pi/2
+} MP_CURVE_TYPE;
+
+
+//------------------------------------------------------------------------------
+// Capability bits. Used by the object to specify what capabilities it has.
+//------------------------------------------------------------------------------
+typedef DWORD MP_CAPS;
+// Curve capabilities - If the cap bit is set, that type of curve is supported
+const MP_CAPS MP_CAPS_CURVE_JUMP = MP_CURVE_JUMP;
+const MP_CAPS MP_CAPS_CURVE_LINEAR = MP_CURVE_LINEAR;
+const MP_CAPS MP_CAPS_CURVE_SQUARE = MP_CURVE_SQUARE;
+const MP_CAPS MP_CAPS_CURVE_INVSQUARE = MP_CURVE_INVSQUARE;
+const MP_CAPS MP_CAPS_CURVE_SINE = MP_CURVE_SINE;
+
+
+//------------------------------------------------------------------------------
+// Structure used to return information about the type and limits of a parameter
+//------------------------------------------------------------------------------
+typedef struct _MP_PARAMINFO {
+ MP_TYPE mpType; // One of MP_TYPE_xxx codes
+ MP_CAPS mopCaps; // A collection of MP_CAPS flags
+
+ // Minimum and maximum values
+ MP_DATA mpdMinValue; // minimum legal value
+ MP_DATA mpdMaxValue; // maximum legal value
+ MP_DATA mpdNeutralValue; // default or 'center' value
+
+ // Defualt Unit and Label text. These strings will ALWAYS be English
+ // strings in the UNICODE character set. For international text
+ // use the GetParamText member function
+ WCHAR szUnitText[32]; // units of the parameter
+ WCHAR szLabel[32]; // name of the parameter
+
+} MP_PARAMINFO;
+
+
+//------------------------------------------------------------------------------
+// Parameter Index types
+//------------------------------------------------------------------------------
+typedef DWORD DWORD;
+const DWORD DWORD_ALLPARAMS = -1; // Apply this operation to all params
+
+
+//------------------------------------------------------------------------------
+// Defined list of timestamp types
+//------------------------------------------------------------------------------
+typedef DWORD MP_TIMEDATA; // Extra data to further define type
+
+// REFERENCE_TIME (1 tick = 100 nanoseconds, MP_TIMEDATA ignored)
+cpp_quote("DEFINE_GUID(GUID_TIME_REFERENCE,")
+cpp_quote("0x93ad712b, 0xdaa0, 0x4ffe, 0xbc, 0x81, 0xb0, 0xce, 0x50, 0xf, 0xcd, 0xd9);")
+
+// Music Time (MP_TIMEDATA = parts/quarter note)
+cpp_quote("DEFINE_GUID(GUID_TIME_MUSIC,")
+cpp_quote("0x574c49d, 0x5b04, 0x4b15, 0xa5, 0x42, 0xae, 0x28, 0x20, 0x30, 0x11, 0x7b);")
+
+// Time is measures in samples. MP_TIMEDATA = Samples/sec)
+cpp_quote("DEFINE_GUID(GUID_TIME_SAMPLES,")
+cpp_quote("0xa8593d05, 0xc43, 0x4984, 0x9a, 0x63, 0x97, 0xaf, 0x9e, 0x2, 0xc4, 0xc0);")
+
+
+//------------------------------------------------------------------------------
+// The value of a given parameter at a specific point in time
+//------------------------------------------------------------------------------
+typedef DWORD MP_FLAGS;
+const MP_FLAGS MPF_ENVLP_STANDARD = 0x0000; // Use all data provided
+const MP_FLAGS MPF_ENVLP_BEGIN_CURRENTVAL = 0x0001;
+ // Ignore valStart value, use current value as the staring point
+const MP_FLAGS MPF_ENVLP_BEGIN_NEUTRALVAL = 0x0002;
+ // Ignore valStart value, use neutral value as the staring point
+
+typedef struct _MP_ENVELOPE_SEGMENT {
+ REFERENCE_TIME rtStart; // Start time in current time format
+ REFERENCE_TIME rtEnd; // End time in current time format
+ MP_DATA valStart; // Initial Value
+ MP_DATA valEnd; // Final Value
+ MP_CURVE_TYPE iCurve; // One of MP_CURVE_TYPE codes
+ MP_FLAGS flags; // Special cases
+} MP_ENVELOPE_SEGMENT;
+
+//------------------------------------------------------------------------------
+// Define flags for Punch-in timing
+//------------------------------------------------------------------------------
+const MP_FLAGS MPF_PUNCHIN_REFTIME = 0; // Use the reference time as the PI time
+const MP_FLAGS MPF_PUNCHIN_NOW = 0x0001; // Punch in at the current clock time
+const MP_FLAGS MPF_PUNCHIN_STOPPED = 0x0002; // Return change notifications during
+ // author time
+
+//------------------------------------------------------------------------------
+// IMediaParamInfo - Interface used to determine the names, data types and
+// units of the parameters which are exposed by the object. This interface
+// is used at discovery time, and is not required during run-time since the
+// objects parameters are a fixed set and this data can be cached by the
+// calling applicaiton.
+//------------------------------------------------------------------------------
+[
+object,
+uuid(6d6cbb60-a223-44aa-842f-a2f06750be6d),
+version(1.0)
+]
+interface IMediaParamInfo : IUnknown
+{
+ HRESULT GetParamCount (
+ [out] DWORD * pdwParams
+ );
+ HRESULT GetParamInfo (
+ [in] DWORD dwParamIndex,
+ [out] MP_PARAMINFO * pInfo
+ );
+ // returns a series of null terminated strings. strings are in the
+ // following order:
+ // Param Label, Units Text, 1st Enum Text, 2nd Enum Text, etc...
+ HRESULT GetParamText (
+ [in] DWORD dwParamIndex, // which param to get text for
+ [out] WCHAR **ppwchText // returns ptr to CoTaskMemAlloc'd string
+ );
+
+ // Returns the number of diffrent time formats this object understands
+ HRESULT GetNumTimeFormats (
+ [out] DWORD * pdwNumTimeFormats
+ );
+
+ // Returns the GUID for the ith supported time format
+ HRESULT GetSupportedTimeFormat(
+ [in] DWORD dwFormatIndex,
+ [out] GUID *pguidTimeFormat
+ );
+
+ // Returns the current time format
+ HRESULT GetCurrentTimeFormat (
+ [out] GUID *pguidTimeFormat,
+ [out] MP_TIMEDATA *pTimeData
+ );
+}
+
+//------------------------------------------------------------------------------
+// IMediaParams - Interfaes used to actually set the media params and the
+// envelopes to follow
+//------------------------------------------------------------------------------
+[
+object,
+uuid(6d6cbb61-a223-44aa-842f-a2f06750be6e),
+version(1.0)
+]
+interface IMediaParams : IUnknown
+{
+ // Single param Get/Set methods
+ HRESULT GetParam (
+ [in] DWORD dwParamIndex,
+ [out] MP_DATA *pValue
+ );
+ HRESULT SetParam (
+ [in] DWORD dwParamIndex,
+ [in] MP_DATA value
+ );
+
+ // Envelope methods (param change over time)
+ HRESULT AddEnvelope (
+ [in] DWORD dwParamIndex,
+ [in] DWORD cSegments,
+ [in] MP_ENVELOPE_SEGMENT * pEnvelopeSegments
+ );
+
+ // Flush all of the envelope information for the given paramter between
+ // the timestamps specified
+ HRESULT FlushEnvelope (
+ [in] DWORD dwParamIndex,
+ [in] REFERENCE_TIME refTimeStart,
+ [in] REFERENCE_TIME refTimeEnd
+ );
+
+ // Change the time format being used by the object
+ HRESULT SetTimeFormat (
+ [in] GUID guidTimeFormat,
+ [in] MP_TIMEDATA mpTimeData
+ );
+}
+
+
+
diff --git a/dxsdk/Include/DShowIDL/mixerocx.idl b/dxsdk/Include/DShowIDL/mixerocx.idl
new file mode 100644
index 00000000..5e45b459
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/mixerocx.idl
@@ -0,0 +1,72 @@
+// Copyright (c) 1998 Microsoft Corporation. All Rights Reserved.
+import "unknwn.idl";
+
+// data id flags, used to notify the client whenever pertinent data changes
+#define MIXER_DATA_ASPECT_RATIO 0x00000001 // picture aspect ratio changed
+#define MIXER_DATA_NATIVE_SIZE 0x00000002 // native size of video changed
+#define MIXER_DATA_PALETTE 0x00000004 // palette of video changed
+
+// status flags defined here
+#define MIXER_STATE_MASK 0x00000003 // use this mask with state status bits
+#define MIXER_STATE_UNCONNECTED 0x00000000 // mixer is unconnected and stopped
+#define MIXER_STATE_CONNECTED_STOPPED 0x00000001 // mixer is connected and stopped
+#define MIXER_STATE_CONNECTED_PAUSED 0x00000002 // mixer is connected and paused
+#define MIXER_STATE_CONNECTED_PLAYING 0x00000003 // mixer is connected and playing
+
+interface IMixerOCXNotify;
+interface IMixerOCX;
+
+[
+ object,
+ uuid(81A3BD31-DEE1-11d1-8508-00A0C91F9CA0),
+ helpstring("IMixerOCXNotify Interface"),
+ pointer_default(unique)
+]
+interface IMixerOCXNotify : IUnknown
+{
+ // invalidates the rect
+ HRESULT OnInvalidateRect([in] LPCRECT lpcRect);
+
+ // informs that a status change has occured, new status bits provided in ulStatusFlags
+ HRESULT OnStatusChange([in] ULONG ulStatusFlags);
+
+ // informs that data parameters, whose id is present in ilDataFlags has changed
+ HRESULT OnDataChange([in] ULONG ulDataFlags);
+};
+
+[
+ object,
+ uuid(81A3BD32-DEE1-11d1-8508-00A0C91F9CA0),
+ helpstring("IMixerOCX Interface"),
+ pointer_default(unique)
+]
+interface IMixerOCX : IUnknown
+{
+ // used to notify the mixer that the display mode has changed, the mixer handles this
+ // asynchronously and the calls OnStatusChange(MIXER_DISPLAYCHANGE_HANDLED) when processing
+ // is done
+ HRESULT OnDisplayChange([in] ULONG ulBitsPerPixel, [in] ULONG ulScreenWidth, [in] ULONG ulScreenHeight);
+
+ HRESULT GetAspectRatio([out] LPDWORD pdwPictAspectRatioX, [out] LPDWORD pdwPictAspectRatioY);
+
+ HRESULT GetVideoSize([out] LPDWORD pdwVideoWidth, [out] LPDWORD pdwVideoHeight);
+
+ HRESULT GetStatus([out] LPDWORD *pdwStatus);
+
+ // the dc provided here is not supposed to be cached. If apps have set a dc using
+ // SetDrawInfo, then it is illegal to provide a non NULL argument here
+ HRESULT OnDraw([in] HDC hdcDraw, [in] LPCRECT prcDraw);
+
+ // lpptTopLeftSC should be NULL unless MIXER_DRAW_DC_ONSCREEN is set to TRUE
+ // specifying a NULL value for lprcClip means no clipping
+ // lpptTopLeftSC - top left corner of surface/dc in screen coordinates
+ // prcDrawCC - draw rectangle in surface/dc coordinates
+ // lprcClip - clipping rect in surface/dc coordinates (optional)
+ HRESULT SetDrawRegion([in] LPPOINT lpptTopLeftSC, [in] LPCRECT prcDrawCC, [in] LPCRECT lprcClip);
+
+ // function to set the sink interface for client notification
+ HRESULT Advise([in] IMixerOCXNotify *pmdns);
+
+ // function to remove the sink interface
+ HRESULT UnAdvise();
+};
diff --git a/dxsdk/Include/DShowIDL/mmstream.idl b/dxsdk/Include/DShowIDL/mmstream.idl
new file mode 100644
index 00000000..b94f1ed1
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/mmstream.idl
@@ -0,0 +1,190 @@
+//------------------------------------------------------------------------------
+// File: MMStream.idl
+//
+// Desc: MultiMedia streaming interface IDL file. Used by MIDL tool
+// to generate mmstream.h.
+//
+// Copyright (c) 1998-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "unknwn.idl";
+
+cpp_quote("#define MS_ERROR_CODE(x) MAKE_HRESULT(1, FACILITY_ITF, (x) + 0x400)")
+cpp_quote("#define MS_SUCCESS_CODE(x) MAKE_HRESULT(0, FACILITY_ITF, x)")
+cpp_quote("#define MS_S_PENDING MS_SUCCESS_CODE(1)")
+cpp_quote("#define MS_S_NOUPDATE MS_SUCCESS_CODE(2)")
+cpp_quote("#define MS_S_ENDOFSTREAM MS_SUCCESS_CODE(3)")
+
+cpp_quote("#define MS_E_SAMPLEALLOC MS_ERROR_CODE(1)")
+cpp_quote("#define MS_E_PURPOSEID MS_ERROR_CODE(2)")
+cpp_quote("#define MS_E_NOSTREAM MS_ERROR_CODE(3)")
+cpp_quote("#define MS_E_NOSEEKING MS_ERROR_CODE(4)")
+cpp_quote("#define MS_E_INCOMPATIBLE MS_ERROR_CODE(5)")
+cpp_quote("#define MS_E_BUSY MS_ERROR_CODE(6)")
+cpp_quote("#define MS_E_NOTINIT MS_ERROR_CODE(7)")
+cpp_quote("#define MS_E_SOURCEALREADYDEFINED MS_ERROR_CODE(8)")
+cpp_quote("#define MS_E_INVALIDSTREAMTYPE MS_ERROR_CODE(9)")
+cpp_quote("#define MS_E_NOTRUNNING MS_ERROR_CODE(10)")
+
+cpp_quote("// {A35FF56A-9FDA-11d0-8FDF-00C04FD9189D}")
+cpp_quote("DEFINE_GUID(MSPID_PrimaryVideo, ")
+cpp_quote("0xa35ff56a, 0x9fda, 0x11d0, 0x8f, 0xdf, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);")
+
+cpp_quote("// {A35FF56B-9FDA-11d0-8FDF-00C04FD9189D}")
+cpp_quote("DEFINE_GUID(MSPID_PrimaryAudio,")
+cpp_quote("0xa35ff56b, 0x9fda, 0x11d0, 0x8f, 0xdf, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);")
+
+cpp_quote("#if(_WIN32_WINNT < 0x0400)")
+typedef void (__stdcall * PAPCFUNC)(DWORD_PTR dwParam);
+cpp_quote("#endif")
+
+typedef LONGLONG STREAM_TIME;
+
+typedef GUID MSPID;
+typedef REFGUID REFMSPID;
+
+typedef enum {
+ STREAMTYPE_READ = 0,
+ STREAMTYPE_WRITE = 1,
+ STREAMTYPE_TRANSFORM= 2
+} STREAM_TYPE;
+
+typedef enum {
+ STREAMSTATE_STOP = 0,
+ STREAMSTATE_RUN = 1
+} STREAM_STATE;
+
+
+typedef enum {
+ COMPSTAT_NOUPDATEOK = 0x00000001,
+ COMPSTAT_WAIT = 0x00000002,
+ COMPSTAT_ABORT = 0x00000004
+} COMPLETION_STATUS_FLAGS;
+
+// Flags for GetInformation
+enum {
+ MMSSF_HASCLOCK = 0x00000001,
+ MMSSF_SUPPORTSEEK = 0x00000002,
+ MMSSF_ASYNCHRONOUS = 0x00000004
+};
+
+// Flags for StreamSample::Update
+enum {
+ SSUPDATE_ASYNC = 0x00000001,
+ SSUPDATE_CONTINUOUS = 0x00000002
+};
+
+interface IMultiMediaStream;
+interface IMediaStream;
+interface IStreamSample;
+
+// IMultiMediaStream interface
+[
+object,
+local,
+uuid(B502D1BC-9A57-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IMultiMediaStream : IUnknown {
+
+ HRESULT GetInformation(
+ [out] DWORD *pdwFlags,
+ [out] STREAM_TYPE *pStreamType);
+
+ HRESULT GetMediaStream(
+ [in] REFMSPID idPurpose,
+ [out] IMediaStream **ppMediaStream);
+
+ HRESULT EnumMediaStreams(
+ [in] long Index,
+ [out] IMediaStream **ppMediaStream);
+
+ HRESULT GetState(
+ [out] STREAM_STATE *pCurrentState);
+
+ HRESULT SetState(
+ [in] STREAM_STATE NewState);
+
+ HRESULT GetTime(
+ [out] STREAM_TIME *pCurrentTime);
+
+ HRESULT GetDuration(
+ [out] STREAM_TIME *pDuration);
+
+ HRESULT Seek(
+ [in] STREAM_TIME SeekTime);
+
+ HRESULT GetEndOfStreamEventHandle(
+ [out] HANDLE *phEOS);
+};
+
+
+// IMediaStream interface
+[
+object,
+uuid(B502D1BD-9A57-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IMediaStream : IUnknown {
+
+ HRESULT GetMultiMediaStream(
+ [out] IMultiMediaStream **ppMultiMediaStream);
+
+ HRESULT GetInformation(
+ [out] MSPID *pPurposeId,
+ [out] STREAM_TYPE *pType);
+
+ HRESULT SetSameFormat(
+ [in] IMediaStream *pStreamThatHasDesiredFormat,
+ [in] DWORD dwFlags);
+
+ HRESULT AllocateSample(
+ [in] DWORD dwFlags,
+ [out] IStreamSample **ppSample);
+
+
+ HRESULT CreateSharedSample(
+ [in] IStreamSample *pExistingSample,
+ [in] DWORD dwFlags,
+ [out] IStreamSample **ppNewSample);
+
+ HRESULT SendEndOfStream(DWORD dwFlags);
+};
+
+
+// IStreamSample interface
+[
+object,
+local,
+uuid(B502D1BE-9A57-11d0-8FDE-00C04FD9189D),
+pointer_default(unique)
+]
+interface IStreamSample : IUnknown {
+
+ HRESULT GetMediaStream(
+ [in] IMediaStream **ppMediaStream);
+
+ HRESULT GetSampleTimes(
+ [out] STREAM_TIME * pStartTime,
+ [out] STREAM_TIME * pEndTime,
+ [out] STREAM_TIME * pCurrentTime);
+
+ HRESULT SetSampleTimes(
+ [in] const STREAM_TIME *pStartTime,
+ [in] const STREAM_TIME *pEndTime);
+
+ HRESULT Update(
+ [in] DWORD dwFlags,
+ [in] HANDLE hEvent,
+ [in] PAPCFUNC pfnAPC,
+ [in] DWORD_PTR dwAPCData);
+
+ HRESULT CompletionStatus(
+ [in] DWORD dwFlags,
+ [in] DWORD dwMilliseconds);
+};
+
+
+
+
diff --git a/dxsdk/Include/DShowIDL/mstve.idl b/dxsdk/Include/DShowIDL/mstve.idl
new file mode 100644
index 00000000..07383041
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/mstve.idl
@@ -0,0 +1,1450 @@
+// Copyright (c) 1999,2000,2001 Microsoft Corporation. All Rights Reserved.
+// MSTvE.idl : IDL source for MSTvE.dll
+//
+// This file will be processed by the MIDL tool to
+// produce the type library (TveContr.tlb) and marshalling code.
+//
+// Need to put MIDL attributes of:
+// 'noncreatable' on
+// 'hidden' on
+// 'nonbrowsable' on
+//
+// -- _Helper interfaces need to be in the library section or else
+// can't seen them in the client
+//
+// -- None of the _Helper interfaces are marked dual. Hence they
+// won't work up on the client... (???)
+//
+// ---------------------------------------------------
+// CAUTION - if Change methods below, need to regen the proxy-stub file
+// nmake -f MSTvEps.mk
+// regsvr32 /s MSTvEps.dll
+//
+//
+// Also - if change any of the IID's, need to rebuild ..\uuid\[]\strmiids.lib
+
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Microsoft Windows")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999, 2000.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("#pragma once")
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+ // forward declarations
+interface ITVETrigger;
+interface ITVETrack;
+interface ITVEVariation;
+interface ITVEEnhancement;
+interface ITVEService;
+interface ITVEActiveService;
+interface ITVESupervisor;
+interface ITVEAttrMap;
+interface ITVEAttrTimeQ;
+
+interface ITVETracks;
+interface ITVEVariations;
+interface ITVEEnhancements;
+interface ITVEServices;
+
+interface ITVEFile;
+
+interface ITVESupervisor_Helper;
+
+// Listener..
+interface ITVEMCast;
+interface ITVEMCasts;
+interface ITVEMCastManager;
+interface ITVEMCastCallback;
+
+// interfaces to configure the filter and get events from,
+interface ITVEFilter ;
+interface ITVEFilter_Helper;
+
+// glue stuff
+interface ITVENavAid;
+interface ITVENavAid_Helper;
+interface ITVENavAid_NoVidCtl;
+interface ITVETriggerCtrl;
+interface ITVETriggerCtrl_Helper;
+
+interface ITVEFeature;
+interface ITVESupervisorGITProxy;
+// ----------------------------------------------------------------------------------
+
+#define COLLECTID_Item DISPID_VALUE // (0)
+#define COLLECTID_Count 1 // standard set of collection interfaces
+#define COLLECTID_Add 2
+#define COLLECTID_Remove 3
+#define COLLECTID_RemoveAll 4 // extra for maps
+#define COLLECTID_Key 5
+#define COLLECTID_Replace 6
+#define COLLECTID_Insert 7
+#define COLLECTID_Update 8
+
+typedef enum NENH_Mode
+{
+ NENH_New,
+ NENH_Duplicate,
+ NENH_Updated,
+ NENH_Starting,
+ NENH_Expired
+} NENH_Mode;
+
+typedef enum NPKG_Mode
+{
+ NPKG_Starting, // brand new packet (never seen this UUID before)
+ NPKG_Received, // correctly received and decoded a package
+ NPKG_Duplicate, // duplicate send of a one already successfully received (packet 0 only)
+ NPKG_Resend, // resend of one that wasn't received correctly before (packet 0 only)
+ NPKG_Expired
+} NPKG_Mode;
+
+typedef enum NTRK_Mode
+{
+ NTRK_New,
+ NTRK_Duplicate, // exact duplicate of existing one
+ NTRK_Updated, // updated version of existing one
+ NTRK_Starting, // (not used???)
+ NTRK_Expired
+} NTRK_Mode;
+
+typedef enum NFLE_Mode
+{
+ NFLE_Received, // correctly received and decoded a package
+ NFLE_Expired
+} NFLE_Mode;
+
+typedef enum NTUN_Mode
+{
+ NTUN_New, // new station (service) never seen before
+ NTUN_Retune, // tuning back to an existing station
+ NTUN_Reactivate, // retuning to the current station
+ NTUN_Turnoff, // turning atvef off
+ NTUN_Fail // failed to tune for some reason
+} NTUN_Mode;
+
+
+typedef enum NWHAT_Mode // used in NotifyAuxInfo
+{
+ NWHAT_Announcement,
+ NWHAT_Trigger,
+ NWHAT_Data,
+ NWHAT_Other,
+ NWHAT_Extra
+} NWHAT_Mode;
+
+
+
+
+ // ---------------------------------------------------------------------
+
+ [
+ object,
+ uuid(05500101-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVETrigger Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVETrigger : IDispatch
+ {
+ [propget, id(1), helpstring("property Parent")] HRESULT Parent([out, retval] IUnknown* *pVal);
+ [propget, id(2), helpstring("property Service")] HRESULT Service([out, retval] ITVEService* *pVal);
+ [propget, id(3), helpstring("property IsValid")] HRESULT IsValid([out, retval] VARIANT_BOOL *pVal);
+ [propget, id(4), helpstring("property URL")] HRESULT URL([out, retval] BSTR *pVal);
+ [propget, id(5), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);
+ [propget, id(6), helpstring("property Expires")] HRESULT Expires([out, retval] DATE *pVal);
+ [propget, id(7), helpstring("property Executes")] HRESULT Executes([out, retval] DATE *pVal);
+ [propget, id(8), helpstring("property Script")] HRESULT Script([out, retval] BSTR *pVal);
+ [propget, id(9), helpstring("property TVELevel")] HRESULT TVELevel([out, retval] float *pVal);
+ [propget, id(10), helpstring("property Rest")] HRESULT Rest([out, retval] BSTR *pVal);
+ [ id(11), helpstring("method ParseTrigger")] HRESULT ParseTrigger([in] const BSTR rVal);
+ };
+
+ [
+ object,
+ uuid(05500201-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ hidden,
+ helpstring("ITVETrigger_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVETrigger_Helper : IUnknown
+ {
+ [ id(1), helpstring("method ConnectParent")] HRESULT ConnectParent([in] ITVETrack *pTrack);
+ [propget, id(2), helpstring("property CRC")] HRESULT CRC([in] const BSTR rVal, [out, retval] BSTR *pbstrCRC);
+ [ id(3), helpstring("method UpdateFrom")] HRESULT UpdateFrom([in] ITVETrigger *pTrigger, [out] long *plgrfTRKChanged);
+ [ id(4), helpstring("method RemoveYourself")] HRESULT RemoveYourself();
+ [ id(5), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pbstrBuff);
+ };
+
+
+// ---------------------------------------------------
+
+ [
+ object,
+ uuid(05500102-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVETrack Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVETrack : IDispatch
+ {
+ [propget, id(1), helpstring("property Parent")] HRESULT Parent([out, retval] IUnknown* *pVal);
+ [propget, id(2), helpstring("property Service")] HRESULT Service([out, retval] ITVEService* *pVal);
+ [propget, id(3), helpstring("property Trigger")] HRESULT Trigger([out, retval] ITVETrigger* *pVal);
+ [propget, id(4), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal);
+ [propput, id(4), helpstring("property Description")] HRESULT Description([in] BSTR newVal);
+ [ id(5), helpstring("method AttachTrigger")] HRESULT AttachTrigger([in] ITVETrigger *pTrigger);
+ [ id(6), helpstring("method ReleaseTrigger")] HRESULT ReleaseTrigger();
+ [ id(7), helpstring("method CreateTrigger")] HRESULT CreateTrigger([in] const BSTR bstrDescription);
+ };
+
+ [
+ object,
+ uuid(05500202-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ hidden,
+ helpstring("ITVETrack_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVETrack_Helper : IUnknown
+ {
+ [id(1), helpstring("method ConnectParent")] HRESULT ConnectParent(ITVEVariation *pVariation);
+ [id(2), helpstring("method RemoveYourself")] HRESULT RemoveYourself();
+ [id(3), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pbstrBuff);
+ };
+
+ [
+ object,
+ uuid(05500112-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVETracks Interface"),
+ pointer_default(unique)
+ ]
+
+ interface ITVETracks : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] ITVETrack * *pVal);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] ITVETrack *pTrack);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [ id(COLLECTID_Insert), helpstring("method Insert")] HRESULT Insert([in] int iLoc, [in] ITVETrack *pTrack);
+ };
+
+// ---------------------------------------------------
+
+ [
+ object,
+ uuid(05500103-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEVariation Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEVariation : IDispatch
+ {
+ [propget, id(1), helpstring("property Parent")] HRESULT Parent([out, retval] IUnknown* *pVal);
+ [propget, id(2), helpstring("property Service")] HRESULT Service([out, retval] ITVEService* *pVal);
+ [propget, id(3), helpstring("property Tracks")] HRESULT Tracks([out, retval] ITVETracks* *pVal);
+ [propget, id(4), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal);
+ [propput, id(4), helpstring("property Description")] HRESULT Description([in] BSTR newVal);
+
+ [propget, id(5), helpstring("property IsValid")] HRESULT IsValid([out, retval] VARIANT_BOOL *pVal);
+ [propget, id(6), helpstring("property MediaName")] HRESULT MediaName([out, retval] BSTR *newVal);
+ [propget, id(7), helpstring("property MediaTitle")] HRESULT MediaTitle([out, retval] BSTR *newVal);
+ [propget, id(8), helpstring("property FileIPAdapter")] HRESULT FileIPAdapter([out, retval] BSTR *newVal);
+ [propget, id(9), helpstring("property FileIPAddress")] HRESULT FileIPAddress([out, retval] BSTR *newVal);
+ [propget, id(10), helpstring("property FilePort")] HRESULT FilePort([out, retval] LONG *lPort);
+ [propget, id(11), helpstring("property TriggerIPAdapter")] HRESULT TriggerIPAdapter([out, retval] BSTR *newVal);
+ [propget, id(12), helpstring("property TriggerIPAddress")] HRESULT TriggerIPAddress([out, retval] BSTR *newVal);
+ [propget, id(13), helpstring("property TriggerPort")] HRESULT TriggerPort([out, retval] LONG *lPort);
+ [propget, id(14),helpstring("property Languages")] HRESULT Languages([out, retval] ITVEAttrMap* *ppVal);
+ [propget, id(15),helpstring("property SDPLanguages")] HRESULT SDPLanguages([out, retval] ITVEAttrMap* *ppVal);
+ [propget, id(16),helpstring("property Bandwidth")] HRESULT Bandwidth([out, retval] LONG *lVal);
+ [propget, id(17),helpstring("property BandwidthInfo")] HRESULT BandwidthInfo([out, retval] BSTR *newVal);
+ [propget, id(18),helpstring("property Attributes")] HRESULT Attributes([out, retval] ITVEAttrMap* *ppVal);
+
+ [propget, id(19),helpstring("property Rest")] HRESULT Rest([out, retval] ITVEAttrMap* *ppVal);
+ [ id(20),helpstring("method Initialize")] HRESULT Initialize([in] BSTR newVal);
+ };
+
+ [
+ object,
+ uuid(05500203-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ hidden,
+ helpstring("ITVEVariation_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEVariation_Helper : IUnknown
+ {
+ [ id(1), helpstring("method ConnectParent")] HRESULT ConnectParent([in] ITVEEnhancement *pEnhancement);
+ [ id(2), helpstring("method DefaultTo")] HRESULT DefaultTo([in] ITVEVariation *pVariationBase);
+ [ id(3), helpstring("method SetTriggerIPAdapter")] HRESULT SetTriggerIPAdapter([in] BSTR bstrBuff);
+ [ id(4), helpstring("method SetFileIPAdapter")] HRESULT SetFileIPAdapter([in] BSTR bstrBuff);
+ [ id(5), helpstring("method SubParseSDP")] HRESULT SubParseSDP(const BSTR *pbstrSDP, BOOL *pfMissingMedia);
+ [ id(6), helpstring("method ParseCBTrigger")] HRESULT ParseCBTrigger(BSTR bstrTrig);
+ [ id(7), helpstring("method FinalParseSDP")] HRESULT FinalParseSDP();
+ [ id(8), helpstring("method UpdateVariation")] HRESULT UpdateVariation(ITVEVariation *pVarNew, long *plNVAR_grfChanged);
+ [ id(9), helpstring("method InitAsXOver")] HRESULT InitAsXOver();
+ [ id(11), helpstring("method NewXOverLink")] HRESULT NewXOverLink([in] BSTR bstrLine21Trigger);
+ [ id(12), helpstring("method RemoveYourself")] HRESULT RemoveYourself();
+ [propput, id(13), helpstring("property MediaTitle")] HRESULT MediaTitle([in] BSTR bstrBuff);
+ [propput, id(14), helpstring("property IsValid")] HRESULT IsValid([in] VARIANT_BOOL fValid);
+ [ id(15), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *bstrBuff);
+ };
+
+ [
+ object,
+ uuid(05500113-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEVariations Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEVariations : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] ITVEVariation * *pVal);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] ITVEVariation *pEnh);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [ id(COLLECTID_Insert), helpstring("method Insert")] HRESULT Insert([in] int iLoc, [in] ITVEVariation *pEnh);
+ };
+// ---------------------------------------------------
+ [
+ object,
+ uuid(05500104-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEEnhancement Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEEnhancement : IDispatch
+ {
+ [propget, id(1), helpstring("property Parent")] HRESULT Parent([out, retval] IUnknown* *pVal);
+ [propget, id(2), helpstring("property Service")] HRESULT Service([out, retval] ITVEService* *pVal);
+ [propget, id(3), helpstring("property Variations")] HRESULT Variations([out, retval] ITVEVariations* *pVal);
+
+ [propget, id(4), helpstring("property IsValid")] HRESULT IsValid([out, retval] VARIANT_BOOL *pVal);
+ [propget, id(5), helpstring("property ProtocolVersion")] HRESULT ProtocolVersion([out, retval] BSTR *pVal);
+ [propget, id(6), helpstring("property SessionUserName")] HRESULT SessionUserName([out, retval] BSTR *pVal);
+ [propget, id(7), helpstring("property SessionId")] HRESULT SessionId([out, retval] LONG *plVal);
+ [propget, id(8), helpstring("property SessionVersion")] HRESULT SessionVersion([out, retval] LONG *plVal);
+ [propget, id(9), helpstring("property SessionIPAddress")] HRESULT SessionIPAddress([out, retval] BSTR *pVal);
+ [propget, id(10), helpstring("property SessionName")] HRESULT SessionName([out, retval] BSTR *pVal);
+ [propget, id(11), helpstring("property EmailAddresses")] HRESULT EmailAddresses([out, retval] ITVEAttrMap* *pVal);
+ [propget, id(12), helpstring("property PhoneNumbers")] HRESULT PhoneNumbers([out, retval] ITVEAttrMap* *pVal);
+
+ [propget, id(13), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal);
+ [propput, id(13), helpstring("property Description")] HRESULT Description([in] BSTR newVal);
+ [propget, id(14), helpstring("property DescriptionURI")] HRESULT DescriptionURI([out, retval] BSTR *pVal);
+
+ [propget, id(15), helpstring("property UUID")] HRESULT UUID([out, retval] BSTR *pVal);
+ [propget, id(16), helpstring("property StartTime")] HRESULT StartTime([out, retval] DATE *pVal);
+ [propget, id(17), helpstring("property StopTime")] HRESULT StopTime([out, retval] DATE *pVal);
+ [propget, id(18), helpstring("property IsPrimary")] HRESULT IsPrimary([out, retval] VARIANT_BOOL *pVal);
+
+ [propget, id(19), helpstring("property Type")] HRESULT Type([out, retval] BSTR *pVal);
+ [propget, id(20), helpstring("property TveType")] HRESULT TveType([out, retval] BSTR *pVal);
+ [propget, id(21), helpstring("property TveSize")] HRESULT TveSize([out, retval] LONG *plVal);
+ [propget, id(23), helpstring("property TveLevel")] HRESULT TveLevel([out, retval] double *pVal);
+
+ [propget, id(24), helpstring("property Attributes")] HRESULT Attributes([out, retval] ITVEAttrMap* *pVal);
+ [propget, id(25), helpstring("property Rest")] HRESULT Rest([out, retval] ITVEAttrMap* *pVal);
+
+ [propget, id(26), helpstring("property SAPHeaderBits")] HRESULT SAPHeaderBits([out, retval] short *pVal);
+ [propget, id(27), helpstring("property SAPAuthLength")] HRESULT SAPAuthLength([out, retval] short *pVal);
+ [propget, id(28), helpstring("property SAPMsgIDHash")] HRESULT SAPMsgIDHash([out, retval] LONG *pVal);
+ [propget, id(29), helpstring("property SAPSendingIP")] HRESULT SAPSendingIP([out, retval] BSTR *pVal);
+ [propget, id(30), helpstring("property SAPAuthData")] HRESULT SAPAuthData([out, retval] BSTR *pVal);
+
+ [ id(31), helpstring("method ParseAnnouncement")] HRESULT ParseAnnouncement([in] BSTR bstrAdapter, [in] const BSTR *pbstVal, [out] long *plgrfParseError, [out] long *plLineError);
+ };
+
+
+ [
+ object,
+ uuid(05500204-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ hidden,
+ helpstring("ITVEEnhancement_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEEnhancement_Helper : IUnknown
+ {
+ [id(0), helpstring("method ConnectParent")] HRESULT ConnectParent(ITVEService *pService);
+ [id(1), helpstring("method Activate")] HRESULT Activate();
+ [id(2), helpstring("method Deactivate")] HRESULT Deactivate();
+ [id(3), helpstring("method UpdateEnhancement")] HRESULT UpdateEnhancement([in] ITVEEnhancement *pEnhNew,[out] long *plNENH_grfChanged);
+ [id(4), helpstring("method InitAsXOver")] HRESULT InitAsXOver();
+ [id(5), helpstring("method NewXOverLink")] HRESULT NewXOverLink([in] BSTR bstrLine21Trigger);
+ [id(6), helpstring("method RemoveYourself")] HRESULT RemoveYourself();
+ [id(7), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pbstrBuff);
+ };
+
+
+ [
+ object,
+ uuid(05500114-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEEnhancements Interface"),
+ pointer_default(unique)
+ ]
+
+ interface ITVEEnhancements : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] ITVEEnhancement * *pVal);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] ITVEEnhancement *pEnh);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [ id(COLLECTID_Insert), helpstring("method Insert")] HRESULT Insert([in] int iLoc, [in] ITVEEnhancement *pEnh);
+ };
+// ---------------------------------------------------
+
+ [
+ object,
+ uuid(05500105-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEService Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEService : IDispatch
+ {
+ [propget, id(1), helpstring("property Parent")] HRESULT Parent([out, retval] IUnknown* *pVal);
+ [propget, id(2), helpstring("property Enhancements")] HRESULT Enhancements([out, retval] ITVEEnhancements* *pVal);
+ [propget, id(3), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal);
+ [propput, id(3), helpstring("property Description")] HRESULT Description([in] BSTR newVal);
+ [ id(4), helpstring("method Activate")] HRESULT Activate(); // used in tuning, turns on announcement
+ [ id(5), helpstring("method Deactivate")] HRESULT Deactivate(); // used in tuning, turns off announcement
+ [propget, id(6), helpstring("property XOverLinks")] HRESULT XOverLinks([out, retval] ITVETracks* *pVal); // returns ITVETracks (Collection)
+ [propget, id(7),helpstring("property XOverEnhancement")] HRESULT XOverEnhancement([out, retval] ITVEEnhancement* *pVal); // special for tree view...
+ [ id(8), helpstring("method NewXOverLink")] HRESULT NewXOverLink([in] BSTR bstrLine21Trigger);
+ // Set date offset used added to dates before expiring.
+ // Used when doing playback recorded shows, offseting expire dates by this amount
+ [propget, id(9), helpstring("property ExpireOffset")] HRESULT ExpireOffset([out, retval] DATE *pVal);
+ [propput, id(9), helpstring("property ExpireOffset")] HRESULT ExpireOffset([in] DATE newVal);
+ // return the ITVEAttrTimeQ list giving dates of IUnknowns in this service are due to expire
+ [propget, id(10), helpstring("property ExpireQueue")] HRESULT ExpireQueue([out, retval] ITVEAttrTimeQ* *pVal);
+ // Expires any items earlier than the specified date + ExpireOffset
+ // If ezactly zero, Date defaults to <NOW>.
+ [ id(11),helpstring("method ExpireForDate")] HRESULT ExpireForDate([in] DATE dateExpireTime);
+ // Mark Service active, only one Active service currently allowed .. turns off all others.
+ [propget, id(12), helpstring("IsActive")] HRESULT IsActive([out, retval] VARIANT_BOOL *fIsActive);
+ // save and restore an arbitrary property on this service... (Useful with ITVENavAid::CacheState())
+ [propput, id(13), helpstring("Property")] HRESULT Property([in] BSTR bstrPropName, BSTR bstrPropVal);
+ [propget, id(13), helpstring("Property")] HRESULT Property([in] BSTR bstrPropName, [out, retval] BSTR *pbstrPropVal);
+ };
+
+ [
+ object,
+ uuid(05500205-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ hidden,
+ helpstring("ITVEService_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEService_Helper : IUnknown
+ {
+ [ id(1), helpstring("method ConnectParent")] HRESULT ConnectParent([in] ITVESupervisor *pSupervisor);
+ [ id(2), helpstring("method ParseCBAnnouncement")] HRESULT ParseCBAnnouncement([in] BSTR bstrFileTrigAdapter,[in] BSTR *pbstrBuff);
+ [ id(3), helpstring("method SetAnncIPValues")] HRESULT SetAnncIPValues([in] BSTR bstrAnncIPAdapter,[in] BSTR bstrAnncIPAddress,[in] LONG lAnncPort);
+ [ id(4), helpstring("method GetAnncIPValues")] HRESULT GetAnncIPValues([in] BSTR *pbstrAnncIPAdapter,[in] BSTR *pbstrAnncIPAddress,[in] LONG *plAnncPort);
+ [ id(5), helpstring("method InitXOverEnhancement")] HRESULT InitXOverEnhancement();
+ [ id(6), helpstring("method AddToExpireQueue")] HRESULT AddToExpireQueue([in] DATE dateExpires, [in] IUnknown *punkItem);
+ [ id(7), helpstring("method ChangeInExpireQueue")] HRESULT ChangeInExpireQueue([in] DATE dateExpires, [in] IUnknown *punkItem);
+ [ id(8), helpstring("method RemoveFromExpireQueue")] HRESULT RemoveFromExpireQueue([in] IUnknown *punkItem);
+ [ id(9), helpstring("method RemoveEnhFilesFromExpireQueue")] HRESULT RemoveEnhFilesFromExpireQueue([in] ITVEEnhancement *pEnhancement);
+ [propget, id(10), helpstring("method ExpireQueueChangeCount")] HRESULT ExpireQueueChangeCount([out, retval] long *pChangeCount);
+ [ id(11), helpstring("method RemoveYourself")] HRESULT RemoveYourself();
+ [ id(12), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pbstrBuff);
+ };
+
+
+ [
+ object,
+ uuid(05500305-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEFeature Interface (Inherits ITVEService)"),
+ pointer_default(unique)
+ ]
+ interface ITVEFeature : ITVEService
+ {
+ // New methods just for the Feature
+ [id(101), helpstring("method TuneTo")] HRESULT TuneTo([in] BSTR bstrStation, [in] BSTR bstrIPAdapter);
+ [id(102), helpstring("method ReTune")] HRESULT ReTune([in] ITVEService *pService);
+ [id(103), helpstring("method BindToSupervisor")] HRESULT BindToSupervisor([in] ITVESupervisor *pTVESupervisor);
+ // these are incoming events called by Supervisor ((_ITVEvents).. Must match
+ [id(2101), helpstring("method NotifyTVETune")] HRESULT NotifyTVETune([in] NTUN_Mode tuneMode, [in] ITVEService *pService, [in] BSTR bstrDescription, [in] BSTR bstrIPAdapter);
+ [id(2102), helpstring("method NotifyTVEEnhancementNew")] HRESULT NotifyTVEEnhancementNew([in] ITVEEnhancement *pEnh);
+ [id(2103), helpstring("method NotifyTVEEnhancementUpdated")] HRESULT NotifyTVEEnhancementUpdated([in] ITVEEnhancement *pEnh, [in] long lChangedFlags); // changedFlags : NENH_grfDiff
+ [id(2104), helpstring("method NotifyTVEEnhancementStarting")] HRESULT NotifyTVEEnhancementStarting([in] ITVEEnhancement *pEnh);
+ [id(2105), helpstring("method NotifyTVEEnhancementExpired")] HRESULT NotifyTVEEnhancementExpired([in] ITVEEnhancement *pEnh);
+ [id(2106), helpstring("method NotifyTVETriggerNew")] HRESULT NotifyTVETriggerNew([in] ITVETrigger *pTrigger,[in] BOOL fActive);
+ [id(2107), helpstring("method NotifyTVETriggerUpdated")] HRESULT NotifyTVETriggerUpdated([in] ITVETrigger *pTrigger,[in] BOOL fActive, [in] long lChangedFlags); // changedFlags : NTRK_grfDiff
+ [id(2108), helpstring("method NotifyTVETriggerExpired")] HRESULT NotifyTVETriggerExpired([in] ITVETrigger *pTrigger,[in] BOOL fActive);
+ [id(2109), helpstring("method NotifyTVEPackage")] HRESULT NotifyTVEPackage([in] NPKG_Mode engPkgMode, [in] ITVEVariation *pVariation, [in] BSTR bstrUUID, [in] long cBytesTotal, [in] long cBytesReceived);
+ [id(2110), helpstring("method NotifyTVEFile")] HRESULT NotifyTVEFile([in] NFLE_Mode engFileMode, [in] ITVEVariation *pVariation, [in] BSTR bstrUrlName, [in] BSTR bstrFileName);
+ [id(2111), helpstring("method NotifyTVEAuxInfo")] HRESULT NotifyTVEAuxInfo([in] NWHAT_Mode engAuxInfoMode, [in] BSTR bstrAuxInfoString, [in] long lChangedFlags, [in] long lErrorLine); // WhatIsIt is NWHAT_Mode - lChangedFlags is NENH_grfDiff or NTRK_grfDiff treated as error bits
+
+ };
+
+ [
+ object,
+ uuid(05500115-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEServices Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEServices : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] ITVEService * *pVal);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] ITVEService *pService);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [ id(COLLECTID_Insert), helpstring("method Insert")] HRESULT Insert([in] int iLoc, [in] ITVEService *pService);
+ };
+
+
+// ---------------------------------------------------
+
+ [
+ object,
+ uuid(05500106-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVESupervisor Interface"),
+ pointer_default(unique)
+ ]
+
+ interface ITVESupervisor : IDispatch
+ {
+ [propget, id(1), helpstring("property Services")] HRESULT Services([out, retval] ITVEServices* *pVal);
+ [propget, id(2), helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal);
+ [propput, id(2), helpstring("property Description")] HRESULT Description([in] BSTR newVal);
+ [ id(3), helpstring("method TuneTo")] HRESULT TuneTo([in] BSTR bstrDescription, [in] BSTR bstrIPAdapter);
+ [ id(4), helpstring("method ReTune")] HRESULT ReTune([in] ITVEService *pService);
+
+ [ id(5), helpstring("method NewXOverLink")] HRESULT NewXOverLink([in] BSTR bstrLine21Trigger);
+ // Expires any items earlier than the specified date + service.ExpireOffset
+ // If ezactly zero, Date defaults to <NOW>.
+ [ id(6), helpstring("method ExpireForDate")] HRESULT ExpireForDate([in] DATE dateExpireTime);
+
+ // need to be here rather than Helper, since called from Filter, and Supervisor_Helper
+ // not in the proxy-stub DLL
+ [ id(7), restricted, helpstring("method InitStats")] HRESULT InitStats();
+ [ id(8), restricted, helpstring("method GetStats")] HRESULT GetStats([out] BSTR *pbstrBuff); // CTVEStats
+ };
+
+ [
+ object,
+ uuid(05500206-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ hidden,
+ helpstring("ITVESupervisor_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVESupervisor_Helper : IUnknown
+ {
+ [id(1), helpstring("method ConnectParent")] HRESULT ConnectParent([in] IUnknown *pUnk);
+ [id(2), helpstring("method GetActiveService")] HRESULT GetActiveService([out] ITVEService **ppActiveService);
+ [id(3), helpstring("method GetMCastManager")] HRESULT GetMCastManager([out] ITVEMCastManager **pMCastManager);
+ [id(4), helpstring("method UnpackBuffer")] HRESULT UnpackBuffer([in] IUnknown *pTVEVariation, [in] unsigned char *m_rgbData, [in] int cBytes);
+
+ [id(5), helpstring("method NotifyEnhancement")] HRESULT NotifyEnhancement([in] NENH_Mode enhMode,[in] ITVEEnhancement *pEnhancement,[in] long lChangedFlags); // changedFlags NENH_grfDiff
+ [id(6), helpstring("method NotifyTrigger")] HRESULT NotifyTrigger([in] NTRK_Mode trgMode,[in] ITVETrack *pTrack,[in] long lChangedFlags); // changedFlags NTRK_grfDiff
+ [id(7), helpstring("method NotifyPackage")] HRESULT NotifyPackage([in] NPKG_Mode pkgMode, [in] ITVEVariation *pVariation, [in] BSTR bstrPackageUUID, [in] long cBytesTotal, [in] long cBytesReceived);
+ [id(8), helpstring("method NotifyFile")] HRESULT NotifyFile([in] NFLE_Mode fileMode, [in] ITVEVariation *pVariation, [in] BSTR bstrURLName, [in] BSTR bstrFileName);
+ [id(9), helpstring("method NotifyTune")] HRESULT NotifyTune([in] NTUN_Mode tuneMode, [in] ITVEService *pService, [in] BSTR bstrDescription, [in] BSTR bstrIPAdapter);
+ // WhatIsIt is NWHAT_Mode - lChangedFlags is NENH_grfDiff or NTRK_grfDiff treated as error bits
+ [id(10), helpstring("method NotifyAuxInfo")] HRESULT NotifyAuxInfo([in] NWHAT_Mode whatMode, [in] BSTR bstrAuxInfoString, [in] long lgrfWhatDiff, [in] long lLineError);
+
+ [id(11), helpstring("method NotifyEnhancement_XProxy")] HRESULT NotifyEnhancement_XProxy([in] NENH_Mode enhMode,[in] ITVEEnhancement *pEnhancement,[in] long lChangedFlags); // changedFlags NENH_grfDiff
+ [id(12), helpstring("method NotifyTrigger_XProxy")] HRESULT NotifyTrigger_XProxy([in] NTRK_Mode trgMode,[in] ITVETrack *pTrack,[in] long lChangedFlags); // changedFlags NTRK_grfDiff
+ [id(13), helpstring("method NotifyPackage_XProxy")] HRESULT NotifyPackage_XProxy( NPKG_Mode pkgMode, ITVEVariation *pVariation,BSTR bstrPackageUUID, long cBytesTotal,long cBytesReceived);
+ [id(14), helpstring("method NotifyFile_XProxy")] HRESULT NotifyFile_XProxy([in] NFLE_Mode fileMode, [in] ITVEVariation *pVariation, [in] BSTR bstrURLName, [in] BSTR bstrFileName);
+ [id(15), helpstring("method NotifyTune_XProxy")] HRESULT NotifyTune_XProxy([in] NTUN_Mode tuneMode, [in] ITVEService *pService, [in] BSTR bstrDescription, [in] BSTR bstrIPAdapter);
+ [id(16), helpstring("method NotifyAuxInfo_XProxy")] HRESULT NotifyAuxInfo_XProxy([in] NWHAT_Mode whatMode, [in] BSTR bstrAuxInfoString, [in] long lgrfWhatDiff,[in] long lLineError);
+
+ [propget, id(17), helpstring("property HaltFlags")] HRESULT HaltFlags([out, retval] LONG *plGrfHaltFlags);
+ [propput, id(17), helpstring("property HaltFlags")] HRESULT HaltFlags([in] LONG lGrfHaltFlags);
+
+ [ id(18), helpstring("method RemoveAllListenersOnAdapter")] HRESULT RemoveAllListenersOnAdapter([in] BSTR bstrAdapter);
+ [propget, id(19), helpstring("method PossibleIPAdapterAddress")] HRESULT PossibleIPAdapterAddress([in] int iAdapter, [out,retval] BSTR *pbstrIPAdapterAddr);
+ [ id(20), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pbstrBuff);
+
+ [propget, id(21), helpstring("property SupervisorGITProxy")] HRESULT SupervisorGITProxy([out] ITVESupervisorGITProxy **ppSupervisorGITProxy); // internal GIT refcounted pointer to supervisor
+ };
+
+ [
+ hidden,
+ object,
+ uuid(05500306-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVESupervisorGITProxy Interface"),
+ pointer_default(unique)
+ ]
+
+ interface ITVESupervisorGITProxy: IUnknown
+ {
+ [propget, id(1), helpstring("property Supervisor")] HRESULT Supervisor([out, retval] ITVESupervisor **ppVal);
+ [propput, id(1), helpstring("property Supervisor")] HRESULT Supervisor([in] ITVESupervisor *pVal);
+ };
+
+// ---------------------------------------------------
+
+ // ---------------------------------
+ [
+ object,
+ uuid(05500121-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEAttrMap Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEAttrMap : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] BSTR *pVal);
+ [propget, id(COLLECTID_Key), helpstring("property Key")] HRESULT Key([in] VARIANT var, [out, retval] BSTR *pKey);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] BSTR bstrKey, [in] BSTR bstrValue);
+ [ id(COLLECTID_Replace), helpstring("method Replace")] HRESULT Replace([in] BSTR bstrKey, [in] BSTR bstrValue);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [ id(7), helpstring("method Add1")] HRESULT Add1(BSTR bstrValue);
+ [ id(8), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pDump);
+ };
+
+// ---------------------------------------------------
+
+ // ---------------------------------
+ [
+ object,
+ uuid(05500122-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEAttrTimeQ Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEAttrTimeQ : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] IUnknown **ppVal);
+ [propget, id(COLLECTID_Key), helpstring("property Key")] HRESULT Key([in] VARIANT var, [out, retval] DATE *pKey);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] DATE dateKey, [in] IUnknown *pUnk);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ [ id(COLLECTID_Update), helpstring("method Update")] HRESULT Update([in] DATE dateKey, [in] IUnknown *pUnk);
+ [ id(9), helpstring("method LockRead")] HRESULT LockRead();
+ [ id(10), helpstring("method LockWrite")] HRESULT LockWrite();
+ [ id(11), helpstring("method Unlock")] HRESULT Unlock();
+ [ id(12), helpstring("method RemoveSimple")] HRESULT RemoveSimple([in] VARIANT var); // remove without calling var->RemoveYourself()
+ [ id(13), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pDump);
+ };
+
+// ---------------------------------------------------
+ [
+ object,
+ uuid(05500130-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEMCast Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEMCast : IDispatch
+ {
+ [propget, id(1), helpstring("property IPAdapter")] HRESULT IPAdapter([out, retval] BSTR *pVal);
+ [propput, id(1), helpstring("property IPAdapter")] HRESULT IPAdapter([in] BSTR newVal);
+ [propget, id(2), helpstring("property IPAddress")] HRESULT IPAddress([out, retval] BSTR *pVal);
+ [propput, id(2), helpstring("property IPAddress")] HRESULT IPAddress([in] BSTR newVal);
+ [propget, id(3), helpstring("property IPPort")] HRESULT IPPort([out, retval] long *pVal);
+ [propput, id(3), helpstring("property IPPort")] HRESULT IPPort([in] long newVal);
+ [ id(4), helpstring("method Join")] HRESULT Join();
+ [ id(5), helpstring("method Leave")] HRESULT Leave();
+ [propget, id(6), helpstring("property IsJoined")] HRESULT IsJoined([out, retval] VARIANT_BOOL *pVal);
+ [propget, id(7), helpstring("property IsSuspended")] HRESULT IsSuspended([out, retval] VARIANT_BOOL *pVal);
+ [ id(8), helpstring("method Suspend")] HRESULT Suspend(VARIANT_BOOL fSuspend);
+ [propget, id(9), helpstring("property PacketCount")] HRESULT PacketCount([out, retval] long *pVal);
+ [propget, id(10), helpstring("property ByteCount")] HRESULT ByteCount([out, retval] long *pVal);
+ [ id(11), helpstring("method KeepStats")] HRESULT KeepStats(VARIANT_BOOL fKeepStats);
+ [ id(12), helpstring("method ResetStats")] HRESULT ResetStats();
+ [ id(13), helpstring("method SetReadCallback")] HRESULT SetReadCallback([in] int nBuffers, [in] int iPrioritySetback, [in] IUnknown *pVal);
+ [ id(14), helpstring("method ConnectManager")] HRESULT ConnectManager([in] ITVEMCastManager* pVal);
+ [propget, id(15), helpstring("property Manager")] HRESULT Manager([out, retval] IUnknown* *ppVal);
+ [propget, id(16), helpstring("property QueueThreadId")] HRESULT QueueThreadId([out, retval] long* pVal);
+ [propput, id(16), helpstring("property QueueThreadId")] HRESULT QueueThreadId([in] long pVal);
+ [propget, id(17), helpstring("property WhatType")] HRESULT WhatType([out, retval] NWHAT_Mode *pWhatType);
+ [propput, id(17), helpstring("property WhatType")] HRESULT WhatType([in] NWHAT_Mode whatType);
+ };
+
+ [
+ object,
+ uuid(05500131-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEMCasts Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEMCasts : IDispatch
+ {
+ [propget, id(DISPID_NEWENUM), restricted, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] IUnknown **pCollection);
+ [propget, id(COLLECTID_Count), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(COLLECTID_Item), helpstring("property Item")] HRESULT Item([in] VARIANT var, [out, retval] ITVEMCast * *pVal);
+ [ id(COLLECTID_Add), helpstring("method Add")] HRESULT Add([in] ITVEMCast *punk);
+ [ id(COLLECTID_Remove), helpstring("method Remove")] HRESULT Remove([in] VARIANT var);
+ [ id(COLLECTID_RemoveAll), helpstring("method RemoveAll")] HRESULT RemoveAll();
+ };
+ [
+ object,
+ uuid(05500132-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEMCastManager Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEMCastManager : IDispatch
+ {
+ [propget, id(1), helpstring("property MCasts")] HRESULT MCasts([out, retval] ITVEMCasts* *pVal);
+ [propget, id(2), helpstring("property Supervisor")] HRESULT Supervisor([out, retval] ITVESupervisor* *ppSupervisor);
+ [propput, id(2), helpstring("property Supervisor")] HRESULT Supervisor([in] ITVESupervisor *pSupervisor);
+ [ id(3), helpstring("method AddMulticast")] HRESULT AddMulticast([in] NWHAT_Mode whatType, [in] BSTR bsAdapter, [in] BSTR bsIPAddress, [in] LONG ulIPPort, [in] LONG cBuffers, [in] IUnknown *pICallback, [out] ITVEMCast **ppMCastAdded);
+ [ id(4), helpstring("method FindMulticast")] HRESULT FindMulticast([in] BSTR bstrIPAdapter, [in] BSTR bstrIPAddress, [in] LONG sPort, [out] ITVEMCast **ppMCast, [out] LONG *pcMatches);
+ [ id(5), helpstring("method RemoveMulticast")] HRESULT RemoveMulticast(ITVEMCast *pMCast);
+ [ id(6), helpstring("method JoinAll")] HRESULT JoinAll();
+ [ id(7), helpstring("method LeaveAll")] HRESULT LeaveAll();
+ [ id(8), helpstring("method SuspendAll")] HRESULT SuspendAll([in] VARIANT_BOOL fSuspend);
+ [ id(9), helpstring("method Lock_")] HRESULT Lock_();
+ [ id(10), helpstring("method Unlock_")] HRESULT Unlock_();
+ [ id(11), helpstring("method DumpStatsToBSTR")] HRESULT DumpStatsToBSTR(int iType, BSTR *pBSTR);
+ [propget, id(13), helpstring("property HaltFlags")] HRESULT HaltFlags([out, retval] LONG *plGrfHaltFlags);
+ [propput, id(13), helpstring("property HaltFlags")] HRESULT HaltFlags([in] LONG lGrfHaltFlags);
+ };
+
+ [
+ object,
+ uuid(05500232-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ hidden,
+ helpstring("ITVEMCastManager_Helper Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEMCastManager_Helper : IUnknown
+ {
+ [ id(1), helpstring("method DumpString")] HRESULT DumpString(BSTR bstrDump); // writes string to a Dump.txt
+ [ id(2), helpstring("method CreateQueueThread")] HRESULT CreateQueueThread();
+ [ id(3), helpstring("method KillQueueThread")] HRESULT KillQueueThread();
+ [ id(4), helpstring("method PostToQueueThread")] HRESULT PostToQueueThread(UINT uiMsg, WPARAM wParam, LPARAM lParam);
+ [ id(5), helpstring("method GetPacketCounts")] HRESULT GetPacketCounts([out] LONG *pCPackets, [out] LONG *pCPacketsDropped, [out] LONG *pCPacketsDroppedTotal);
+ };
+
+
+ [
+ object,
+ uuid(05500133-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEMCastCallback Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEMCastCallback : IDispatch
+ {
+ [id(1), helpstring("method SetMCast")] HRESULT SetMCast(ITVEMCast *pMCast);
+ [id(2), helpstring("method ProcessPacket")] HRESULT ProcessPacket(unsigned char *pchBuffer, long cBytes, long lPacketId);
+ [id(3), helpstring("method PostPacket")] HRESULT PostPacket(unsigned char *pchBuffer, long cBytes, long wPacketId);
+ };
+
+
+
+
+ // ................ specific callbacks ..............
+ [
+ object,
+ uuid(05500141-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVECBAnnc Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVECBAnnc : IDispatch
+ {
+ [id(1), helpstring("method Init")] HRESULT Init(BSTR bstrFileTrigAdapter, ITVEService *pService); // want ITVEService here
+ };
+ [
+ object,
+ uuid(05500142-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVECBTrig Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVECBTrig : IDispatch
+ {
+ [id(1), helpstring("method Init")] HRESULT Init(ITVEVariation *pIVariation);
+ };
+ [
+ object,
+ uuid(05500143-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVECBFile Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVECBFile : IDispatch
+ {
+ [id(1), helpstring("method Init")] HRESULT Init(ITVEVariation *pIVariation, ITVEService *pIService);
+ };
+ [
+ object,
+ uuid(05500144-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVECBDummy Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVECBDummy : IDispatch
+ {
+ [id(1), helpstring("method Init")] HRESULT Init(int i);
+ };
+
+
+// ----------------------------------------------------
+ [
+ object,
+ uuid(05500151-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVEFile Interface"),
+ pointer_default(unique)
+ ]
+ interface ITVEFile : IDispatch
+ {
+ [ id(1), helpstring("method InitializeFile")] HRESULT InitializeFile([in] ITVEVariation *pVaria, [in] BSTR bsName, [in] BSTR bsLoc, [in] DATE dateExpires);
+ [ id(2), helpstring("method InitializePackage")] HRESULT InitializePackage([in] ITVEVariation *pVaria, [in] BSTR bsName, [in] BSTR bsLoc, [in] DATE dateExpires);
+ [propget, id(3), helpstring("property Description")] HRESULT Description([out, retval] BSTR* pBstrDesc);
+ [propget, id(4), helpstring("property Location")] HRESULT Location([out, retval] BSTR* pBstrLoc);
+ [propget, id(5), helpstring("property ExpireTime")] HRESULT ExpireTime([out, retval] DATE* pDateExpires);
+ [propget, id(6), helpstring("property IsPackage")] HRESULT IsPackage([out, retval] BOOL* pfVal);
+ [propget, id(7), helpstring("property Variation")] HRESULT Variation([out, retval] ITVEVariation* *pVal);
+ [propget, id(8), helpstring("property Service")] HRESULT Service([out, retval] ITVEService* *pVal);
+ [ id(9), helpstring("method RemoveYourself")] HRESULT RemoveYourself();
+ [ id(10), helpstring("method DumpToBSTR")] HRESULT DumpToBSTR([out] BSTR *pBstrDump);
+ };
+
+
+// ----------------------------------------------------
+// ITVENavAid
+// ----------------------------------------------------
+
+[
+ object,
+ uuid (05500160-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVENavAid Interface"),
+ pointer_default(unique)
+]
+interface ITVENavAid : IDispatch
+{
+ [propput, id(1), helpstring("property WebBrowserApp")] HRESULT WebBrowserApp([in] IDispatch *pWebBrowser);
+ [propget, id(1), helpstring("property WebBrowserApp")] HRESULT WebBrowserApp([out, retval] IDispatch **ppWebBrowser);
+ [propget, id(2), helpstring("property TVETriggerCtrl")] HRESULT TVETriggerCtrl([out, retval] ITVETriggerCtrl **ppTriggerCtrl);
+ [propput, id(3), helpstring("property EnableAutoTriggering")] HRESULT EnableAutoTriggering([in] long lAutoTriggers);
+ [propget, id(3), helpstring("property EnableAutoTriggering")] HRESULT EnableAutoTriggering([out, retval] long *plAutoTriggers);
+ [propget, id(4), helpstring("property ActiveVariation")] HRESULT ActiveVariation([out, retval] ITVEVariation **ppActiveVariation);
+ [propput, id(4), helpstring("property ActiveVariation")] HRESULT ActiveVariation([in] ITVEVariation *pActiveVariation);
+ [propget, id(5), helpstring("property TVEFeature")] HRESULT TVEFeature([out, retval] ITVEFeature **ppTVEFeature);
+ [propget, id(6), helpstring("property CacheState")] HRESULT CacheState([out, retval] BSTR *pbstrBuff);
+ [propput, id(6), helpstring("property CacheState")] HRESULT CacheState([in] BSTR bstrBuff);
+ [ , id(7), helpstring("method NavUsingTVETrigger")] HRESULT NavUsingTVETrigger([in] ITVETrigger *pTrigger, [in] long lForceNav, [in] long lForceExec);
+ [ , id(8), helpstring("method ExecScript")] HRESULT ExecScript([in] BSTR bstrScript, [in] BSTR bstrLanguage);
+ [ , id(9), helpstring("method Navigate")] HRESULT Navigate([in] VARIANT *URL,[in] VARIANT *Flags,[in] VARIANT *TargetFrameName, [in] VARIANT *PostData, [in] VARIANT *Headers);
+ [propget, id(10), helpstring("property CurrTVEName")] HRESULT CurrTVEName([out, retval] BSTR *pbstrName);
+ [propget, id(11), helpstring("property CurrTVEURL")] HRESULT CurrTVEURL([out, retval] BSTR *pbstrURL);
+
+ // these are incoming sinkn events called by Supervisor ((_ITVEvents).. ID's Must match (I think)
+ // &DIID__ITVEEvents
+ [id(2101), helpstring("method NotifyTVETune")] HRESULT NotifyTVETune([in] NTUN_Mode tuneMode, [in] ITVEService *pService, [in] BSTR bstrDescription, [in] BSTR bstrIPAdapter);
+ [id(2102), helpstring("method NotifyTVEEnhancementNew")] HRESULT NotifyTVEEnhancementNew([in] ITVEEnhancement *pEnh);
+ [id(2103), helpstring("method NotifyTVEEnhancementUpdated")] HRESULT NotifyTVEEnhancementUpdated([in] ITVEEnhancement *pEnh, [in] long lChangedFlags); // changedFlags : NENH_grfDiff
+ [id(2104), helpstring("method NotifyTVEEnhancementStarting")] HRESULT NotifyTVEEnhancementStarting([in] ITVEEnhancement *pEnh);
+ [id(2105), helpstring("method NotifyTVEEnhancementExpired")] HRESULT NotifyTVEEnhancementExpired([in] ITVEEnhancement *pEnh);
+ [id(2106), helpstring("method NotifyTVETriggerNew")] HRESULT NotifyTVETriggerNew([in] ITVETrigger *pTrigger,[in] BOOL fActive);
+ [id(2107), helpstring("method NotifyTVETriggerUpdated")] HRESULT NotifyTVETriggerUpdated([in] ITVETrigger *pTrigger,[in] BOOL fActive, [in] long lChangedFlags); // changedFlags : NTRK_grfDiff
+ [id(2108), helpstring("method NotifyTVETriggerExpired")] HRESULT NotifyTVETriggerExpired([in] ITVETrigger *pTrigger,[in] BOOL fActive);
+ [id(2109), helpstring("method NotifyTVEPackage")] HRESULT NotifyTVEPackage([in] NPKG_Mode engPkgMode, [in] ITVEVariation *pVariation, [in] BSTR bstrUUID, [in] long cBytesTotal, [in] long cBytesReceived);
+ [id(2110), helpstring("method NotifyTVEFile")] HRESULT NotifyTVEFile([in] NFLE_Mode engFileMode, [in] ITVEVariation *pVariation, [in] BSTR bstrUrlName, [in] BSTR bstrFileName);
+ [id(2111), helpstring("method NotifyTVEAuxInfo")] HRESULT NotifyTVEAuxInfo([in] NWHAT_Mode engAuxInfoMode, [in] BSTR bstrAuxInfoString, [in] long lChangedFlags, [in] long lErrorLine); // WhatIsIt is NWHAT_Mode - lChangedFlags is NENH_grfDiff or NTRK_grfDiff treated as error bits
+
+
+ // &DIID_DWebBrowserEvents2,
+
+ [id(0x66), helpstring("method NotifyStatusTextChange")] HRESULT NotifyStatusTextChange(BSTR Text);
+ [id(0x6c), helpstring("method NotifyProgressChange")] HRESULT NotifyProgressChange(LONG Progress, LONG ProgressMax);
+ [id(0x69), helpstring("method NotifyCommandStateChange")] HRESULT NotifyCommandStateChange(LONG Command, VARIANT_BOOL Enable);
+ [id(0x6a), helpstring("method NotifyDownloadBegin")] HRESULT NotifyDownloadBegin();
+ [id(0x68), helpstring("method NotifyDownloadComplete")] HRESULT NotifyDownloadComplete();
+ [id(0x71), helpstring("method NotifyTitleChange")] HRESULT NotifyTitleChange(BSTR Text);
+ [id(0x70), helpstring("method NotifyPropertyChange")] HRESULT NotifyPropertyChange(BSTR szProperty);
+ [id(0xfa), helpstring("method NotifyBeforeNavigate2")] HRESULT NotifyBeforeNavigate2(IDispatch * pDisp, VARIANT * URL, VARIANT * Flags, VARIANT * TargetFrameName, VARIANT * PostData, VARIANT * Headers, VARIANT_BOOL * Cancel);
+ [id(0xfb), helpstring("method NotifyNewWindow2")] HRESULT NotifyNewWindow2(IDispatch * * ppDisp, VARIANT_BOOL * Cancel);
+ [id(0xfc), helpstring("method NotifyNavigateComplete2")] HRESULT NotifyNavigateComplete2(IDispatch * pDisp, VARIANT * URL);
+ [id(0x103), helpstring("method NotifyDocumentComplete")] HRESULT NotifyDocumentComplete(IDispatch * pDisp, VARIANT * URL);
+ [id(0xfd), helpstring("method NotifyOnQuit")] HRESULT NotifyOnQuit();
+ [id(0xfe), helpstring("method NotifyOnVisible")] HRESULT NotifyOnVisible(VARIANT_BOOL Visible);
+ [id(0xff), helpstring("method NotifyOnToolBar")] HRESULT NotifyOnToolBar(VARIANT_BOOL ToolBar);
+ [id(0x100), helpstring("method NotifyOnMenuBar")] HRESULT NotifyOnMenuBar(VARIANT_BOOL MenuBar);
+ [id(0x101), helpstring("method NotifyOnStatusBar")] HRESULT NotifyOnStatusBar(VARIANT_BOOL StatusBar);
+ [id(0x102), helpstring("method NotifyOnFullScreen")] HRESULT NotifyOnFullScreen(VARIANT_BOOL FullScreen);
+ [id(0x104), helpstring("method NotifyOnTheaterMode")] HRESULT NotifyOnTheaterMode(VARIANT_BOOL TheaterMode);
+
+} ;
+ // ------
+ // these interfaces for running without the VidControl
+ // - idea is to create CoCreate supervisor, and 'put' it here.
+[
+ object,
+ uuid (05500360-FAA5-4df9-8246-BFC23AC5CEA8),
+ hidden,
+// dual,
+ helpstring("ITVENavAid_NoVidCtl Interface"),
+ pointer_default(unique)
+]
+interface ITVENavAid_NoVidCtl : IUnknown
+{
+ [propput ,id(1), helpstring("property NoVidCtl_Supervisor")] HRESULT NoVidCtl_Supervisor([in] ITVESupervisor *pSuper);
+ [propget ,id(1), helpstring("property NoVidCtl_Supervisor")] HRESULT NoVidCtl_Supervisor([out,retval] ITVESupervisor **ppSuper);
+
+} ;
+
+ // ------
+[
+ object,
+ uuid (05500260-FAA5-4df9-8246-BFC23AC5CEA8),
+ hidden,
+ dual, // - used in proxying, must be marked Dual regardless of what .net says
+ helpstring("ITVENavAid_Helper Interface"),
+ pointer_default(unique)
+]
+interface ITVENavAid_Helper : IUnknown
+{
+ [ id(1), helpstring("method LocateVidAndTriggerCtrls")] HRESULT LocateVidAndTriggerCtrls([out] IDispatch **pVidCtrl, [out] IDispatch **pTrigCtrl);
+ [ id(2), helpstring("method NotifyTVETriggerUpdated_XProxy")] HRESULT NotifyTVETriggerUpdated_XProxy([in] ITVETrigger *pTrigger,[in] BOOL fActive, [in] long lChangedFlags); // changedFlags : NTRK_grfDiff
+ [ id(3), helpstring("method ReInitCurrNavState")] HRESULT ReInitCurrNavState([in] long lReserved);
+
+} ;
+// ----------------------------------------------------
+// Filter interfaces
+// -----------------------------------------------------
+[
+ object,
+ uuid (05500180-FAA5-4df9-8246-BFC23AC5CEA8),
+// dual,
+ helpstring("TVEFilter Interface"),
+ pointer_default(unique)
+]
+interface ITVEFilter : IUnknown
+{
+// [propget, id(2), helpstring("property Supervisor")] HRESULT Supervisor([out, retval] IDispatch **ppSuperDsp);
+ [propget, id(3), helpstring("property SupervisorPunk")] HRESULT SupervisorPunk([out, retval] IUnknown **ppSuperPunk);
+
+ [propget, id(4), helpstring("property IPAdapterAddress")] HRESULT IPAdapterAddress([out, retval] BSTR *pbstrIPAddr);
+ [propput, id(4), helpstring("property IPAdapterAddress")] HRESULT IPAdapterAddress([in] BSTR bstrIPAddr);
+
+ [propget, id(5), helpstring("property StationID")] HRESULT StationID([out, retval] BSTR *pbstrStationID);
+ [propput, id(5), helpstring("property StationID")] HRESULT StationID([in] BSTR bstrStationID);
+
+ [propget, id(6), helpstring("property MulticastList")] HRESULT MulticastList([out, retval] BSTR *pbstrMulticastList);
+ [propget, id(7), helpstring("property AdapterDescription")] HRESULT AdapterDescription([out, retval] BSTR *pbstrAdapterDescription);
+
+ [ id(8), helpstring("method ReTune")] HRESULT ReTune();
+
+ // should move to FilterHelper
+ [propget, id(9), helpstring("property HaltFlags")] HRESULT HaltFlags([out, retval] LONG *plGrfHaltFlags);
+ [propput, id(9), helpstring("property HaltFlags")] HRESULT HaltFlags([in] LONG lGrfHaltFlags);
+
+ [ id(10), helpstring("method ParseCCBytePair")] HRESULT ParseCCBytePair([in] LONG lByteType, [in] BYTE byte1, [in] BYTE byte2);
+
+ [propget, id(11), helpstring("property IPSinkAdapterAddress")] HRESULT IPSinkAdapterAddress([out, retval] BSTR *pbstrIPAddr);
+
+// [propput, id(12), helpstring("property SupervisorHelperPunk")] HRESULT get_SupervisorHelperPunk([out] IUnknown **ppSuperHelper);
+
+};
+
+// ------------------------------------------------------
+[
+ object,
+ uuid (05500280-FAA5-4df9-8246-BFC23AC5CEA8),
+ hidden,
+ helpstring("ITVEFilter_Helper Interface"),
+ pointer_default(unique)
+]
+interface ITVEFilter_Helper : IUnknown
+{
+// [id(1),helpstring("method ConnectParent")] HRESULT ConnectParent([in] ITVEEnhancement *pEnhancement);
+} ;
+
+
+[
+ object,
+ uuid (05500190-FAA5-4df9-8246-BFC23AC5CEA8),
+ dual,
+ helpstring("ITVETriggerCtrl Interface"),
+ pointer_default(unique)
+]
+interface ITVETriggerCtrl : IDispatch
+{
+ [propput, id(1)] HRESULT enabled([in] VARIANT_BOOL newVal);
+ [propget, id(1)] HRESULT enabled([out, retval] VARIANT_BOOL* pVal);
+ [propget, id(2)] HRESULT sourceID([out, retval] BSTR* pbstrID);
+ [propput, id(3)] HRESULT releasable([in] VARIANT_BOOL newVal);
+ [propget, id(3)] HRESULT releasable([out, retval] VARIANT_BOOL* pVal);
+ [propget, id(4)] HRESULT backChannel([out, retval] BSTR* pVal);
+ [propget, id(5)] HRESULT contentLevel([out, retval] double* pVal);
+} ;
+
+[
+ object,
+ uuid (05500191-FAA5-4df9-8246-BFC23AC5CEA8),
+ hidden,
+ helpstring("ITVETriggerCtrl_Helper Interface"),
+ pointer_default(unique)
+]
+interface ITVETriggerCtrl_Helper : IUnknown
+{
+ [propput, id(1)] HRESULT sourceID([in] BSTR pSourceUUID); // cache the SourceID
+ [propget, id(2)] HRESULT TopLevelPage([out, retval] BSTR *pURL); // return the cached URL (???) of the top web page
+
+} ;
+
+// ---------------------------------------------------------------------------------------
+// ***************************************************************************************
+// ----------------------------------------------------------------------------------------
+[
+ uuid(1700C001-6666-4f66-B1E2-BF3C9FBB9BA6), // new
+ version(1.0),
+ helpstring("Microsoft TVE Library and DShow Filter")
+]
+library MSTvELib
+{
+ importlib("stdole32.tlb");
+ importlib("stdole2.tlb");
+// -------------------------------------------------------
+typedef enum NENH_grfDiff // need to fill out..
+{
+ NENH_grfNone = 0x0000, // no flags
+ NENH_grfDescription = 0x00000001,
+ NENH_grfIsPrimary = 0x00000002,
+ NENH_grfProtocolVersion = 0x00000004,
+ NENH_grfSessionUserName = 0x00000008,
+ NENH_grfSessionId = 0x00000010,
+ NENH_grfSessionVersion = 0x00000020,
+ NENH_grfSessionIPAddress = 0x00000040,
+ NENH_grfSessionName = 0x00000080,
+ NENH_grfEmailAddresses = 0x00000100,
+ NENH_grfPhoneNumbers = 0x00000200,
+ NENH_grfUUID = 0x00000400,
+ NENH_grfStartTime = 0x00000800,
+ NENH_grfStopTime = 0x00001000,
+ NENH_grfType = 0x00002000,
+ NENH_grfTveType = 0x00004000,
+ NENH_grfTveSize = 0x00008000,
+ NENH_grfTveLevel = 0x00010000,
+ NENH_grfAttributes = 0x00020000,
+ NENH_grfRest = 0x00040000,
+ NENH_grfVariationAdded = 0x00080000,
+ NENH_grfVariationRemoved = 0x00100000,
+ NENH_grfDescriptionURI = 0x00200000,
+ NENH_grfSomeVarIP = 0x00400000,
+ NENH_grfSomeVarText = 0x00800000,
+ NENH_grfSomeVarBandwidth = 0x01000000,
+ NENH_grfSomeVarLanguages = 0x02000000,
+ NENH_grfSomeVarAttribute = 0x04000000,
+ NENH_grfUnused = 0x08000000,
+ NENH_grfSAPVersion = 0x10000000,
+ NENH_grfSAPAddressType = 0x20000000,
+ NENH_grfSAPOther = 0x40000000,
+ NENH_grfSAPEncryptComp = 0x80000000,
+ NENH_grfAnyIP = (NENH_grfSomeVarIP | NENH_grfVariationAdded | NENH_grfVariationRemoved),
+ NENH_grfAll = (NENH_grfSomeVarAttribute<<1) - 1 // all flags
+} NENH_grfDiff;
+
+typedef enum NVAR_grfDiff
+{
+ NVAR_grfNone = 0x0000,
+ NVAR_grfDescription = 0x0001,
+ NVAR_grfMediaName = 0x0002,
+ NVAR_grfMediaTitle = 0x0004,
+ NVAR_grfFilePort = 0x0008,
+ NVAR_grfFileIPAddress = 0x0010,
+ NVAR_grfFileIPAdapter = 0x0020,
+ NVAR_grfTriggerPort = 0x0040,
+ NVAR_grfTriggerIPAddress = 0x0080,
+ NVAR_grfTriggerIPAdapter = 0x0100,
+ NVAR_grfAttributes = 0x0200,
+ NVAR_grfLanguages = 0x0400,
+ NVAR_grfBandwidth = 0x0800,
+ NVAR_grfBandwidthInfo = 0x1000,
+ NVAR_grfRest = 0x2000,
+ NVAR_grfAnyIP = (NVAR_grfFilePort | NVAR_grfFileIPAddress | NVAR_grfFileIPAdapter |
+ NVAR_grfTriggerPort | NVAR_grfTriggerIPAddress | NVAR_grfTriggerIPAdapter),
+ NVAR_grfAnyText = (NVAR_grfDescription | NVAR_grfMediaName | NVAR_grfMediaTitle),
+ NVAR_grfAnyBandwidth = (NVAR_grfBandwidth | NVAR_grfBandwidthInfo),
+ NVAR_grfAnyAttribute = (NVAR_grfAttributes | NVAR_grfRest),
+
+ NVAR_grfAll = (NVAR_grfRest<<1) - 1 // all flags
+} NVAR_grfDiff;
+
+
+typedef enum NTRK_grfDiff // attempt at a bit-field flag
+{
+ NTRK_grfNone = 0x00,
+ NTRK_grfURL = 0x01,
+ NTRK_grfName = 0x02,
+ NTRK_grfScript = 0x04,
+ NTRK_grfDate = 0x08,
+ NTRK_grfTVELevel= 0x10,
+ NTRK_grfExpired = 0x20, // trigger arrived out of date
+ NTRK_grfRest = 0x40,
+ NTRK_grfAll = (NTRK_grfRest<<1) - 1 // all flags
+} NTRK_grfDiff;
+
+typedef enum NFLT_grfHaltFlags // flags to turn various processing bits off
+{
+ NFLT_grfNone = 0x00,
+
+ NFLT_grfTA_Listen = 0x01, // don't listen for CC (XOverLink) triggers
+ NFLT_grfTA_Decode = 0x02, // don't accumulate byte data for XOverLink triggers into strings
+ NFLT_grfTA_Parse = 0x04, // don't parse any XOverLink data
+
+ NFLT_grfTB_AnncListen = 0x10, // suspend listening for announcement packets if set
+ NFLT_grfTB_AnncDecode = 0x20, // suspend decoding and processing of announcement packets if set
+ NFLT_grfTB_AnncParse = 0x40, // don't parse any announcements
+
+ NFLT_grfTB_TrigListen = 0x100, // suspend listening for transport B triggers
+ NFLT_grfTB_TrigDecode = 0x200, // suspend listening for transport B triggers
+ NFLT_grfTB_TrigParse = 0x400, // don't parse any transport B triggers
+
+ NFLT_grfTB_DataListen = 0x1000, // suspend listening for transport B data (files)
+ NFLT_grfTB_DataDecode = 0x2000, // suspend listening for transport B data (files)
+ NFLT_grfTB_DataParse = 0x4000, // don't parse any transport B data (files)
+
+ NFLT_grf_ExpireQueue = 0x10000, // turn expire queue processing on and off
+ NFLT_grf_Extra1 = 0x100000, // extra flag
+ NFLT_grf_Extra2 = 0x200000, // extra flag
+ NFLT_grf_Extra3 = 0x400000, // extra flag
+ NFLT_grf_Extra4 = 0x800000 //extra flag
+
+} NFLT_grfHaltFlags;
+
+
+// -------------------------------------------------
+// ---------------------------------------------------
+// CAUTION - if Change events below, need to perform (after MIDL compiling this file):
+// CTVESupervisor->Implement Connection Point (_ITVEEvents)
+// AND
+// CTVEFeature->Implement Connection Point (_ITVEEvents)
+// to regenerate the CProxy_ITVEEvents<> code.
+//
+// Select Browse... button, goto filters\tve\mstve\objd\i386 directory, use mstve.tlb
+//
+// Note thefile MSTvECP.h must be checked out.
+//
+
+ [
+ uuid(05500000-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("_ITVEEvents Interface")
+ ]
+ dispinterface _ITVEEvents
+ {
+ properties:
+ methods:
+ [id(2101), helpstring("method NotifyTVETune")] HRESULT NotifyTVETune([in] NTUN_Mode tuneMode, [in] ITVEService *pService, [in] BSTR bstrDescription, [in] BSTR bstrIPAdapter);
+ [id(2102), helpstring("method NotifyTVEEnhancementNew")] HRESULT NotifyTVEEnhancementNew([in] ITVEEnhancement *pEnh);
+ [id(2103), helpstring("method NotifyTVEEnhancementUpdated")] HRESULT NotifyTVEEnhancementUpdated([in] ITVEEnhancement *pEnh, [in] long lChangedFlags); // changedFlags : NENH_grfDiff
+ [id(2104), helpstring("method NotifyTVEEnhancementStarting")] HRESULT NotifyTVEEnhancementStarting([in] ITVEEnhancement *pEnh);
+ [id(2105), helpstring("method NotifyTVEEnhancementExpired")] HRESULT NotifyTVEEnhancementExpired([in] ITVEEnhancement *pEnh);
+ [id(2106), helpstring("method NotifyTVETriggerNew")] HRESULT NotifyTVETriggerNew([in] ITVETrigger *pTrigger,[in] BOOL fActive);
+ [id(2107), helpstring("method NotifyTVETriggerUpdated")] HRESULT NotifyTVETriggerUpdated([in] ITVETrigger *pTrigger,[in] BOOL fActive, [in] long lChangedFlags); // changedFlags : NTRK_grfDiff
+ [id(2108), helpstring("method NotifyTVETriggerExpired")] HRESULT NotifyTVETriggerExpired([in] ITVETrigger *pTrigger,[in] BOOL fActive);
+ [id(2109), helpstring("method NotifyTVEPackage")] HRESULT NotifyTVEPackage([in] NPKG_Mode engPkgMode, [in] ITVEVariation *pVariation, [in] BSTR bstrUUID, [in] long cBytesTotal, [in] long cBytesReceived);
+ [id(2110), helpstring("method NotifyTVEFile")] HRESULT NotifyTVEFile([in] NFLE_Mode engFileMode, [in] ITVEVariation *pVariation, [in] BSTR bstrUrlName, [in] BSTR bstrFileName);
+ [id(2111), helpstring("method NotifyTVEAuxInfo")] HRESULT NotifyTVEAuxInfo([in] NWHAT_Mode engAuxInfoMode, [in] BSTR bstrAuxInfoString, [in] long lChangedFlags, [in] long lErrorLine); // WhatIsIt is NWHAT_Mode - lChangedFlags is NENH_grfDiff or NTRK_grfDiff treated as error bits
+ };
+
+ [
+ uuid(05500001-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVETrigger Class")
+ ]
+ coclass TVETrigger
+ {
+ [default] interface ITVETrigger;
+ interface ITVETrigger_Helper;
+ };
+// ----------------------------------------------------
+
+ [
+ uuid(05500002-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVETrack Class")
+ ]
+ coclass TVETrack
+ {
+ [default] interface ITVETrack;
+ interface ITVETrack_Helper;
+ };
+// ---------------------------------
+// [
+// uuid(05500012-FAA5-4df9-8246-BFC23AC5CEA8),
+// helpstring("TVETracks Class")
+// ]
+// coclass TVETracks
+// {
+// [default] interface ITVETracks;
+// };
+// ----------------------------------------------------
+
+ [
+ uuid(05500003-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEVariation Class")
+ ]
+ coclass TVEVariation
+ {
+ [default] interface ITVEVariation;
+ interface ITVEVariation_Helper;
+ };
+// [
+// uuid(05500013-FAA5-4df9-8246-BFC23AC5CEA8),
+// helpstring("TVEVariations Class")
+// ]
+// coclass TVEVariations
+// {
+// [default] interface ITVEVariations;
+// };
+// ---------------------------------------------------
+ [
+ uuid(05500004-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEEnhancement Class")
+ ]
+ coclass TVEEnhancement
+ {
+ [default] interface ITVEEnhancement;
+ interface ITVEEnhancement_Helper;
+ };
+
+ // --------------------------------
+
+ [
+ uuid(05500014-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEEnhancements Class")
+ ]
+ coclass TVEEnhancements
+ {
+ [default] interface ITVEEnhancements;
+ };
+// ---------------------------------------------------
+
+
+ [
+ uuid(05500005-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEService Class")
+ ]
+ coclass TVEService
+ {
+ [default] interface ITVEService;
+ interface ITVEService_Helper;
+ };
+
+ [
+ uuid(05500025-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEFeature Class")
+ ]
+ coclass TVEFeature
+ {
+ [default] interface ITVEFeature;
+ [default, source] dispinterface _ITVEEvents; // out going event handler
+ interface _ITVEEvents; // incoming event interface
+// interface ITVEService_Helper;
+ };
+
+ // -------------------------------
+
+ [
+ uuid(05500015-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEServices Class")
+ ]
+ coclass TVEServices
+ {
+ [default] interface ITVEServices;
+ };
+
+
+// ---------------------------------------------------
+ [
+ uuid(05500006-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVESupervisor Class")
+ ]
+ coclass TVESupervisor
+ {
+ [default] interface ITVESupervisor;
+ [default, source] dispinterface _ITVEEvents;
+ interface ITVESupervisor_Helper;
+ };
+/*
+ [
+ hidden,
+ uuid(05500406-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("ITVESupervisorGITProxy Class")
+ ]
+ coclass TVESupervisorGITProxy
+ {
+ [default] interface ITVESupervisorGITProxy;
+ };
+ */
+// ---------------------------------------------------
+
+ [
+ uuid(05500021-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEAttrMap Class")
+ ]
+ coclass TVEAttrMap
+ {
+ [default] interface ITVEAttrMap;
+ };
+
+ [
+ uuid(05500022-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEAttrTimeQ Class")
+ ]
+ coclass TVEAttrTimeQ
+ {
+ [default] interface ITVEAttrTimeQ;
+ };
+
+ [
+ uuid(05500030-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEMCast Class")
+ ]
+ coclass TVEMCast
+ {
+ [default] interface ITVEMCast;
+ };
+
+ [
+ uuid(05500031-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEMCasts Class")
+ ]
+ coclass TVEMCasts
+ {
+ [default] interface ITVEMCasts;
+ };
+
+ [
+ uuid(05500032-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEMCastManager Class")
+ ]
+ coclass TVEMCastManager
+ {
+ [default] interface ITVEMCastManager;
+ interface ITVEMCastManager_Helper;
+ };
+
+
+ [
+ uuid(05500040-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEMCastCallback Class")
+ ]
+ coclass TVEMCastCallback
+ {
+ [default] interface ITVEMCastCallback;
+ };
+ [
+ uuid(05500041-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVECBAnnc Class")
+ ]
+ // specific Multicast Callbacks
+ coclass TVECBAnnc
+ {
+ [default] interface ITVECBAnnc;
+ };
+ [
+ uuid(05500042-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVECBTrig Class")
+ ]
+ coclass TVECBTrig
+ {
+ [default] interface ITVECBTrig;
+ };
+ [
+ uuid(05500043-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVECBFile Class")
+ ]
+ coclass TVECBFile
+ {
+ [default] interface ITVECBFile;
+ };
+ [
+ uuid(05500049-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVECBDummy Class")
+ ]
+ coclass TVECBDummy
+ {
+ [default] interface ITVECBDummy;
+ };
+
+
+ [
+ uuid(05500050-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEFile Class")
+ ]
+ coclass TVEFile
+ {
+ [default] interface ITVEFile;
+ }
+
+ // This control gets CoCreate'ed by an app to handle hooking things together
+ [
+ uuid(05500070-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVENavAid Class")
+ ]
+ coclass TVENavAid
+ {
+ [default] interface ITVENavAid; // controllable from HTML
+ interface ITVENavAid_Helper; // internal control methods
+ interface ITVENavAid_NoVidCtl; // to work without the VidControl
+ };
+
+ // this is the DShow TVE Receiver Filter that encapsulates a TVESupervisor
+ // object in a in a DShow graph
+ [
+ uuid(05500080-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVEFilter Class")
+ ]
+ coclass TVEFilter
+ {
+// [default, source] dispinterface _ITVEEvents;
+ [default] interface ITVEFilter;
+ interface ITVEFilter_Helper;
+ };
+
+ // This control gets CoCreated by HTML in <OBJECT TYPE="application\tve-trigger">
+ // Implements the tve-trigger receiver object properties as per Atvef Spec
+ [
+ uuid(05500091-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("_ITVETriggerCtrlEvents Interface")
+ ]
+ dispinterface _ITVETriggerCtrlEvents
+ {
+ properties:
+ methods:
+ };
+
+
+ [
+ uuid(05500090-FAA5-4df9-8246-BFC23AC5CEA8),
+ helpstring("TVETriggerCtrl Class")
+ ]
+ coclass TVETriggerCtrl
+ {
+ [default] interface ITVETriggerCtrl; // controllable from HTML
+ interface ITVETriggerCtrl_Helper; // internal control methods
+ [default, source] dispinterface _ITveTriggerCtrlEvents; // fire control events to HTML
+// interface _ITVEvents; // respond to slew of TVE events
+ };
+
+};
diff --git a/dxsdk/Include/DShowIDL/qedit.idl b/dxsdk/Include/DShowIDL/qedit.idl
new file mode 100644
index 00000000..b75a3e35
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/qedit.idl
@@ -0,0 +1,1734 @@
+//------------------------------------------------------------------------------
+// File: QEdit.idl
+//
+// Copyright (c) 1992 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+import "oaidl.idl";
+import "ocidl.idl";
+import "dxtrans.idl";
+import "amstream.idl";
+import "msxml.idl";
+
+//
+// forward declare
+//
+interface IAMTimelineGroup;
+interface IAMTimelineObj;
+interface IAMTimelineEffect;
+interface IAMTimelineTrans;
+interface IAMTimelineSrc;
+interface IAMTimeline;
+interface IAMErrorLog;
+interface ISampleGrabber;
+interface IPropertySetter;
+
+// used by DEXTER_VALUE's dwInterp var
+typedef enum
+{
+ DEXTERF_JUMP,
+ DEXTERF_INTERPOLATE
+} DEXTERF;
+
+// used to set values on the property setter
+typedef struct
+{
+ BSTR Name;
+ DISPID dispID;
+ LONG nValues;
+} DEXTER_PARAM;
+
+// used to set values on the property setter
+typedef struct
+{
+ VARIANT v;
+ REFERENCE_TIME rt;
+ DWORD dwInterp; // one of the DEXTERF_ flags
+} DEXTER_VALUE;
+
+// used by bMethod directly below
+enum
+{
+ DEXTER_AUDIO_JUMP,
+ DEXTER_AUDIO_INTERPOLATE
+};
+
+// used to set volumes on the mixer and mixer pins
+typedef struct
+{
+ REFERENCE_TIME rtEnd; //end Time
+ double dLevel; //end Volume Level
+ BOOL bMethod; //jump or interpolate
+} DEXTER_AUDIO_VOLUMEENVELOPE ;
+
+// used in IAMTimeline::Get(Set)InsertMode
+enum
+{
+ TIMELINE_INSERT_MODE_INSERT = 1,
+ TIMELINE_INSERT_MODE_OVERLAY = 2
+};
+
+//
+// define what main 'things' can be put into the timeline tree.
+// these values are used quite a bit with timeline access
+// (bitmap mask flags)
+typedef enum
+{
+ TIMELINE_MAJOR_TYPE_COMPOSITE = 1,
+ TIMELINE_MAJOR_TYPE_TRACK = 2,
+ TIMELINE_MAJOR_TYPE_SOURCE = 4,
+ TIMELINE_MAJOR_TYPE_TRANSITION = 8,
+ TIMELINE_MAJOR_TYPE_EFFECT = 16,
+ TIMELINE_MAJOR_TYPE_GROUP = 128
+} TIMELINE_MAJOR_TYPE;
+
+// used in various IAMTimelineXXX "search" functions. Look in this
+// file for "SearchDirection" to see where it's used. I didn't want
+// to use an enum as an interface param type, so I used a long.
+typedef enum
+{
+ DEXTERF_BOUNDING = -1, // finds any source whose start <= Time and stop > Time
+ DEXTERF_EXACTLY_AT = 0, // finds any source that starts exactly at Time
+ DEXTERF_FORWARDS = 1 // finds any source that starts at or after Time
+} DEXTERF_TRACK_SEARCH_FLAGS;
+
+// right now, the media type in the group contains enough information about
+// how we want to recompress. This might not be enough information in the
+// future, so we define a structure we can get and set to the group.
+//
+typedef struct _SCompFmt0
+{
+ long nFormatId;
+ AM_MEDIA_TYPE MediaType;
+} SCompFmt0;
+
+// used in IAMTimelineSrc::Get(Set)StretchMode
+//
+enum
+{
+ RESIZEF_STRETCH,
+ RESIZEF_CROP,
+ RESIZEF_PRESERVEASPECTRATIO,
+ RESIZEF_PRESERVEASPECTRATIO_NOLETTERBOX
+};
+
+// used in IRenderEngine::SetDynamicReconnectLevel
+// (bitmap mask flags)
+enum
+{
+ CONNECTF_DYNAMIC_NONE = 0x00000000,
+ CONNECTF_DYNAMIC_SOURCES = 0x00000001,
+ CONNECTF_DYNAMIC_EFFECTS = 0x00000002
+};
+
+// used in
+// IMediaLocator::FindMediaFile
+// IRenderEngine::SetSourceNameValidation
+// IAMTimeline::ValidateSourceNames
+// (bitmap mask flags)
+enum
+{
+ SFN_VALIDATEF_CHECK = 0x00000001, // do a check. Without this set, no check will be done.
+ SFN_VALIDATEF_POPUP = 0x00000002, // should UI popup show if not found
+ SFN_VALIDATEF_TELLME = 0x00000004, // warn user about replaced files
+ SFN_VALIDATEF_REPLACE = 0x00000008, // should it replace names in the tldb if found
+ SFN_VALIDATEF_USELOCAL = 0x000000010, // use local media preferrably over networked media
+ SFN_VALIDATEF_NOFIND = 0x000000020, // never find filenames, always use UI popup to find.,
+ // when used, _POPUP must be used as well
+ SFN_VALIDATEF_IGNOREMUTED = 0x000000040, // ignore muted files in the tldb
+ SFN_VALIDATEF_END
+};
+
+// key transitions types
+enum
+{
+ DXTKEY_RGB,
+ DXTKEY_NONRED,
+ DXTKEY_LUMINANCE,
+ DXTKEY_ALPHA,
+ DXTKEY_HUE
+};
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+// New Property setting Interfaces
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+// interface for objects which can save/load IDispatch-able properties
+[
+ object,
+ uuid(AE9472BD-B0C3-11D2-8D24-00A0C9441E20),
+ helpstring("IPropertySetter Interface"),
+ pointer_default(unique)
+]
+interface IPropertySetter : IUnknown // IPersist?
+{
+ // for loading and saving through XML
+ HRESULT LoadXML([in] IUnknown * pxml);
+ // !!! doesn't work HRESULT LoadXML([in] IXMLElement * pxml);
+ HRESULT PrintXML([out] char *pszXML, [in] int cbXML, [out] int *pcbPrinted,[in] int indent);
+
+ // for cloning a portion of the props when splitting the object
+ //AUTOMATE
+ HRESULT CloneProps([out] IPropertySetter **ppSetter,
+ [in] REFERENCE_TIME rtStart,
+ [in] REFERENCE_TIME rtStop);
+
+ // for loading and saving programmatically
+ // caller must call this in pre-sorted order, this time must be > all
+ // previous times
+ //AUTOMATE
+ HRESULT AddProp([in] DEXTER_PARAM Param,
+ [in] DEXTER_VALUE *paValue);
+ //AUTOMATE
+ HRESULT GetProps([out] LONG *pcParams,
+ [out] DEXTER_PARAM **paParam,
+ [out] DEXTER_VALUE **paValue);
+ // after calling GetProps, you must call FreeProps to free resources
+ //AUTOMATE
+ HRESULT FreeProps([in] LONG cParams,
+ [in] DEXTER_PARAM *paParam,
+ [in] DEXTER_VALUE *paValue);
+ // to empty to property setter, so you can start over again
+ HRESULT ClearProps();
+
+ // for persisting
+ HRESULT SaveToBlob([out] LONG *pcSize, [out] BYTE **ppb);
+ HRESULT LoadFromBlob([in] LONG cSize, [in] BYTE *pb);
+
+ // to program the object that supports IDispatch with the props
+ // call with rtNow == -1 to set Static Props when your object instantiates
+ // errors will be logged, if a log is provided
+ //AUTOMATE
+ HRESULT SetProps([in] IUnknown *pTarget,
+ [in] REFERENCE_TIME rtNow);
+
+ // unicode version
+ HRESULT PrintXMLW([out] WCHAR *pszXML, [in] int cchXML, [out] int *pcchPrinted,[in] int indent);
+};
+
+// supported by our DxtCompositor class, this allows us to draw whatever comes in
+// upon only a portion of the output bitmap
+
+[
+ object,
+ uuid(BB44391E-6ABD-422f-9E2E-385C9DFF51FC),
+ dual,
+ helpstring("IDxtCompositor Interface"),
+ pointer_default(unique)
+]
+interface IDxtCompositor : IDXEffect
+{
+ [propget, id(1), helpstring("property OffsetX")] HRESULT OffsetX([out, retval] long *pVal);
+ [propput, id(1), helpstring("property OffsetX")] HRESULT OffsetX([in] long newVal);
+ [propget, id(2), helpstring("property OffsetY")] HRESULT OffsetY([out, retval] long *pVal);
+ [propput, id(2), helpstring("property OffsetY")] HRESULT OffsetY([in] long newVal);
+ [propget, id(3), helpstring("property Width")] HRESULT Width([out, retval] long *pVal);
+ [propput, id(3), helpstring("property Width")] HRESULT Width([in] long newVal);
+ [propget, id(4), helpstring("property Height")] HRESULT Height([out, retval] long *pVal);
+ [propput, id(4), helpstring("property Height")] HRESULT Height([in] long newVal);
+
+ [propget, id(5), helpstring("property SrcOffsetX")] HRESULT SrcOffsetX([out, retval] long *pVal);
+ [propput, id(5), helpstring("property SrcOffsetX")] HRESULT SrcOffsetX([in] long newVal);
+ [propget, id(6), helpstring("property SrcOffsetY")] HRESULT SrcOffsetY([out, retval] long *pVal);
+ [propput, id(6), helpstring("property SrcOffsetY")] HRESULT SrcOffsetY([in] long newVal);
+ [propget, id(7), helpstring("property SrcWidth")] HRESULT SrcWidth([out, retval] long *pVal);
+ [propput, id(7), helpstring("property SrcWidth")] HRESULT SrcWidth([in] long newVal);
+ [propget, id(8), helpstring("property SrcHeight")] HRESULT SrcHeight([out, retval] long *pVal);
+ [propput, id(8), helpstring("property SrcHeight")] HRESULT SrcHeight([in] long newVal);
+};
+
+[
+ object,
+ uuid(4EE9EAD9-DA4D-43d0-9383-06B90C08B12B),
+ dual,
+ helpstring("IDxtAlphaSetter Interface"),
+ pointer_default(unique)
+]
+interface IDxtAlphaSetter : IDXEffect
+{
+ // set the alpha to a particular number
+ [propget, id(1), helpstring("property Alpha")] HRESULT Alpha([out, retval] long *pVal);
+ [propput, id(1), helpstring("property Alpha")] HRESULT Alpha([in] long newVal);
+
+ // set the alpha to a percentage of it's full value
+ [propget, id(2), helpstring("property AlphaRamp")] HRESULT AlphaRamp([out, retval] double *pVal);
+ [propput, id(2), helpstring("property AlphaRamp")] HRESULT AlphaRamp([in] double newVal);
+};
+
+// Supported by our JPEG DXT, that can do any wipe based on a bitmap
+//
+
+[
+ object,
+ uuid(DE75D011-7A65-11D2-8CEA-00A0C9441E20),
+ dual,
+ helpstring("IDxtJpeg Interface"),
+ pointer_default(unique)
+]
+interface IDxtJpeg : IDXEffect
+{
+ [propget, id(1), helpstring("property MaskNum")] HRESULT MaskNum([out, retval] long *);
+ [propput, id(1), helpstring("property MaskNum")] HRESULT MaskNum([in] long);
+ [propget, id(2), helpstring("property MaskName")] HRESULT MaskName([out, retval] BSTR *pVal);
+ [propput, id(2), helpstring("property MaskName")] HRESULT MaskName([in] BSTR newVal);
+ [propget, id(3), helpstring("property ScaleX")] HRESULT ScaleX([out, retval] double *);
+ [propput, id(3), helpstring("property ScaleX")] HRESULT ScaleX([in] double);
+ [propget, id(4), helpstring("property ScaleY")] HRESULT ScaleY([out, retval] double *);
+ [propput, id(4), helpstring("property ScaleY")] HRESULT ScaleY([in] double);
+ [propget, id(5), helpstring("property OffsetX")] HRESULT OffsetX([out, retval] long *);
+ [propput, id(5), helpstring("property OffsetX")] HRESULT OffsetX([in] long);
+ [propget, id(6), helpstring("property OffsetY")] HRESULT OffsetY([out, retval] long *);
+ [propput, id(6), helpstring("property OffsetY")] HRESULT OffsetY([in] long);
+ [propget, id(7), helpstring("property ReplicateX")] HRESULT ReplicateX([out, retval] long *pVal);
+ [propput, id(7), helpstring("property ReplicateX")] HRESULT ReplicateX([in] long newVal);
+ [propget, id(8), helpstring("property ReplicateY")] HRESULT ReplicateY([out, retval] long *pVal);
+ [propput, id(8), helpstring("property ReplicateY")] HRESULT ReplicateY([in] long newVal);
+ [propget, id(9), helpstring("property BorderColor")] HRESULT BorderColor([out, retval] long *pVal);
+ [propput, id(9), helpstring("property BorderColor")] HRESULT BorderColor([in] long newVal);
+ [propget, id(10), helpstring("property BorderWidth")] HRESULT BorderWidth([out, retval] long *pVal);
+ [propput, id(10), helpstring("property BorderWidth")] HRESULT BorderWidth([in] long newVal);
+ [propget, id(11), helpstring("property BorderSoftness")] HRESULT BorderSoftness([out, retval] long *pVal);
+ [propput, id(11), helpstring("property BorderSoftness")] HRESULT BorderSoftness([in] long newVal);
+ HRESULT ApplyChanges();
+ HRESULT LoadDefSettings();
+};
+
+ // key
+ [
+ object,
+ uuid(3255de56-38fb-4901-b980-94b438010d7b),
+ dual,
+ helpstring("IDxtKey Interface"),
+ pointer_default(unique)
+ ]
+ interface IDxtKey : IDXEffect
+ {
+ [propget, id(1), helpstring("property KeyType")] HRESULT KeyType([out, retval] int *);
+ [propput, id(1), helpstring("property Keytype")] HRESULT KeyType([in] int);
+ [propget, id(2), helpstring("property Hue")] HRESULT Hue([out, retval] int *);
+ [propput, id(2), helpstring("property Hue")] HRESULT Hue([in] int );
+ [propget, id(3), helpstring("property Luminance")] HRESULT Luminance([out, retval] int *);
+ [propput, id(3), helpstring("property Luminance")] HRESULT Luminance([in] int );
+ [propget, id(4), helpstring("property RGB")] HRESULT RGB([out, retval] DWORD *);
+ [propput, id(4), helpstring("property RGB")] HRESULT RGB([in] DWORD );
+ [propget, id(5), helpstring("property Similarity")] HRESULT Similarity([out,retval] int * );
+ [propput, id(5), helpstring("property Similarity")] HRESULT Similarity([in] int );
+ [propget, id(6), helpstring("property Invert")] HRESULT Invert([out, retval] BOOL *);
+ [propput, id(6), helpstring("property Invert")] HRESULT Invert([in] BOOL);
+ };
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // This little COM interface will look 'around' for the closest
+ // path match for a given file. If the file already exists, then
+ // this interface should hardly do anything. If it's not found,
+ // it will go look for it and if successful, return S_FALSE. If it
+ // cannot find the file, it will call the hook, if set and return
+ // it's return code. if the hook is not set, it is in a type of
+ // error condition. The Dexter-provided MediaLocator will bring up
+ // a dialog box asking you to browse for your file. Other COM
+ // objects may do something else.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(288581E0-66CE-11d2-918F-00C0DF10D434),
+ odl,
+ helpstring("IMediaLocator Interface"),
+ pointer_default(unique)
+]
+interface IMediaLocator : IUnknown
+{
+ // same flags as used by IRenderEngine's SetSourceNameValidation
+ HRESULT FindMediaFile( BSTR Input, BSTR FilterString, BSTR * pOutput, long Flags );
+ HRESULT AddFoundLocation( BSTR DirectoryName );
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // This object provides caching of duration and stream type
+ // information for files that would produce a directshow source
+ // filter. It takes too long to figure this out in DShow right
+ // now, so this is one way around it. The way it works is that
+ // you first fill out the Filename property, then call and
+ // ask how many streams it has, or, set the CurrentStream prop
+ // and then ask for the per-stream properties, StreamType or
+ // StreamLength. They both reference the CurrentStream prop that
+ // you set. I also allowed you (for convenience) to just give
+ // it a IUnknown Filter that represents an IBaseFilter source
+ // filter that is NOT currently in a graph. It will use that
+ // instead. When using this, though, you will not get cached
+ // values. The cached values are stored in the system's ini file
+ // called DCBC2A70-70D8-4459-BFFA-E0D61DEA3FDF.INI. Nice, huh? :-)
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(65BD0710-24D2-4ff7-9324-ED2E5D3ABAFA),
+ odl,
+ helpstring("IMediaDet Interface"),
+ pointer_default(unique)
+]
+interface IMediaDet : IUnknown
+{
+ [propget, id(1), helpstring("property Filter")] HRESULT Filter([out, retval] IUnknown* *pVal);
+ [propput, id(1), helpstring("property Filter")] HRESULT Filter([in] IUnknown* newVal);
+ [propget, id(2), helpstring("property OutputStreams")] HRESULT OutputStreams([out, retval] long *pVal);
+ [propget, id(3), helpstring("property CurrentStream")] HRESULT CurrentStream([out, retval] long *pVal);
+ [propput, id(3), helpstring("property CurrentStream")] HRESULT CurrentStream([in] long newVal);
+ [propget, id(4), helpstring("property StreamType")] HRESULT StreamType([out, retval] GUID *pVal);
+ [propget, id(5), helpstring("property StreamTypeB")] HRESULT StreamTypeB([out, retval] BSTR *pVal);
+ [propget, id(6), helpstring("property StreamLength")] HRESULT StreamLength([out, retval] double *pVal);
+ [propget, id(7), helpstring("property Filename")] HRESULT Filename([out, retval] BSTR *pVal);
+ [propput, id(7), helpstring("property Filename")] HRESULT Filename([in] BSTR newVal);
+ [id(8), helpstring("method GetBitmapBits")] HRESULT GetBitmapBits(double StreamTime, long * pBufferSize, char * pBuffer, long Width, long Height);
+ [id(9), helpstring("method WriteBitmapBits")] HRESULT WriteBitmapBits(double StreamTime, long Width, long Height, BSTR Filename );
+ [propget, id(10), helpstring("property StreamMediaType")] HRESULT StreamMediaType([out, retval] AM_MEDIA_TYPE * pVal);
+ [id(11), helpstring("method GetSampleGrabber")] HRESULT GetSampleGrabber( [out] ISampleGrabber ** ppVal );
+ [propget, id(12), helpstring("property FrameRate")] HRESULT FrameRate([out, retval] double *pVal);
+ [id(13), helpstring("method EnterBitmapGrabMode")] HRESULT EnterBitmapGrabMode( double SeekTime );
+};
+
+
+// useless interface, don't use it!
+
+[
+ object,
+ uuid(AE9472BE-B0C3-11D2-8D24-00A0C9441E20),
+ odl,
+ helpstring("IGrfCache Interface"),
+ pointer_default(unique)
+]
+interface IGrfCache : IDispatch
+{
+ [id(1), helpstring("method AddFilter")]
+ HRESULT AddFilter(
+ IGrfCache * ChainedCache,
+ LONGLONG ID,
+ const IBaseFilter * pFilter,
+ LPCWSTR pName);
+
+ [id(2), helpstring("method ConnectPins")]
+ HRESULT ConnectPins(
+ IGrfCache * ChainedCache,
+ LONGLONG PinID1,
+ const IPin * pPin1,
+ LONGLONG PinID2,
+ const IPin * pPin2);
+
+ [id(3), helpstring("method SetGraph")]
+ HRESULT SetGraph(const IGraphBuilder * pGraph);
+
+ [id(4), helpstring("method DoConnectionsNow")]
+ HRESULT DoConnectionsNow();
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // The RenderEngin builds a graph from the timeline and gives
+ // you some simple positional commands.
+ // explained methods:
+ // SetTimelineObject - tell the render engine who to parse
+ // ConnectEverything - build up a graph based on the timeline
+ // ScrapIt - throw away graph and everything
+ // GetFilterGraph - get the graph that's built up, if any
+ // SetFilterGraph - allows you to preset the graph that's built up.
+ // cannot call this if there already is a graph.
+
+ // !!! the following methods are unused/not implemented
+
+ // SetInterestRange - discard COM objects and memory outside of this
+ // range, if possible. Used for scrubbing on a long timeline and
+ // freeing up resources
+ // SetRenderRange - pretend like a portion of the timeline IS the timeline
+ // and don't connect anything in the graph outside of that range.
+ // Commit - allocate what's necessary and get prepared to run
+ // Decommit - free anything possible
+ // GetCaps - find out some info about the render engine
+ // DoSmartRecompression - connect compressed sources if
+ // possible
+ // in the graph, this will RenderPin( ) on every switcher
+ // rendering pin.
+ // SetSourceNameValidation - allows you to set some flags which
+ // determine how source files are found, if they need to be found.
+ // FilterString is a list of extensions to find for the media
+ // files (see OPENFILENAME filters)
+ // pOverride is a media locator you would like to use instead
+ // of the built in one
+ // The flags are defined in the struct immediately below.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(6BEE3A81-66C9-11d2-918F-00C0DF10D434),
+ odl,
+ helpstring("IRenderEngine Interface"),
+ pointer_default(unique)
+]
+interface IRenderEngine : IUnknown
+{
+ HRESULT SetTimelineObject( IAMTimeline * pTimeline );
+ HRESULT GetTimelineObject( [out] IAMTimeline ** ppTimeline );
+ HRESULT GetFilterGraph( [out] IGraphBuilder ** ppFG );
+ HRESULT SetFilterGraph( IGraphBuilder * pFG );
+ HRESULT SetInterestRange( REFERENCE_TIME Start, REFERENCE_TIME Stop );
+ HRESULT SetInterestRange2( double Start, double Stop );
+ HRESULT SetRenderRange( REFERENCE_TIME Start, REFERENCE_TIME Stop );
+ HRESULT SetRenderRange2( double Start, double Stop );
+ HRESULT GetGroupOutputPin( long Group, [out] IPin ** ppRenderPin );
+ HRESULT ScrapIt( );
+ HRESULT RenderOutputPins( );
+ HRESULT GetVendorString( [out,retval] BSTR * pVendorID );
+ HRESULT ConnectFrontEnd( );
+ HRESULT SetSourceConnectCallback( IGrfCache * pCallback );
+ HRESULT SetDynamicReconnectLevel( long Level );
+ HRESULT DoSmartRecompression( );
+ HRESULT UseInSmartRecompressionGraph( );
+
+ HRESULT SetSourceNameValidation( BSTR FilterString, IMediaLocator * pOverride, LONG Flags );
+
+ // not implemented yet
+ HRESULT Commit( );
+ HRESULT Decommit( );
+ HRESULT GetCaps( long Index, long * pReturn );
+};
+
+[
+ object,
+ uuid(6BEE3A82-66C9-11d2-918F-00C0DF10D434),
+ odl,
+ helpstring("IRenderEngine2 Interface"),
+ pointer_default(unique)
+]
+interface IRenderEngine2 : IUnknown
+{
+ HRESULT SetResizerGUID( GUID ResizerGuid );
+}
+
+// used for the smart render engine when it needs to find a compressor
+[
+ object,
+ uuid(F03FA8DE-879A-4d59-9B2C-26BB1CF83461),
+ odl,
+ helpstring("IFindCompressorCB Interface"),
+ pointer_default(unique)
+]
+interface IFindCompressorCB : IUnknown
+{
+ HRESULT GetCompressor( AM_MEDIA_TYPE * pType, AM_MEDIA_TYPE * pCompType, [out] IBaseFilter ** ppFilter );
+}
+
+[
+ object,
+ uuid(F03FA8CE-879A-4d59-9B2C-26BB1CF83461),
+ odl,
+ helpstring("ISmartRenderEngine Interface"),
+ pointer_default(unique)
+]
+interface ISmartRenderEngine : IUnknown
+{
+ HRESULT SetGroupCompressor( long Group, IBaseFilter * pCompressor );
+ HRESULT GetGroupCompressor( long Group, IBaseFilter ** pCompressor );
+ HRESULT SetFindCompressorCB( IFindCompressorCB * pCallback );
+}
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+// TIMELINE TIMELINE TIMELINE TIMELINE TIMELINE TIMELINE
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Every object on the timeline supports at least this interface.
+ // explained methods:
+ // Get/SetStartStop - the timeline times at which this object is
+ // active. Groups and Tracks have start times of zero.
+ // FixTimes - used by the render engine. Rounds the input times
+ // to the nearest FPS of the parent Group, for use in setting
+ // up the big switch.
+ // GetSubObject - get the sub-object which is associated with this
+ // timeline object. Each timeline object can carry around a
+ // pointer to 'something else'. For our Render Engine, this is
+ // a pointer to a filter that gets put into a graph.
+ // NOTE: Getting the subobject will FORCE it to load if it's possible
+ // to force this. If you don't want it to do this, don't call
+ // this function.
+ // SetSubObject - see GetSubObject
+ // SetSubObjectGUID - instead of giving the node a pointer, you can
+ // instead give it a GUID and see if this works instead. The
+ // sub-object will attempt to be instantiated when 'necessary'
+ // which is really when it's asked for with GetSubObject./
+ // !!! a better way to do this perhaps?
+ // GetSubObjectLoaded - ask if the sub-object pointer is set
+ // Get/SetTimelineType - return the major type which is stored here,
+ // used by the API user and the render engine.
+ // Get/SetTimelineSubType - see above
+ // Get/SetUserID - get and set a number, any number
+ // GetGenID - every created object has a unique number to it. Used
+ // by the render engine.
+ // Get/SetUserName - a storable name, for users of the API
+ // Get/SetPropertySetter - the object that will set properties for this
+ // object (it will support IPropertySetter and it is created by
+ // CPropertySetter)
+ // Get/SetUserData - gets the persistant data used by the user of
+ // the API.
+ // Get/SetMuted - set whether this object should be active or not.
+ // Setting a parent of other objects off also turns off the
+ // sub-objects.
+ // Get/SetLocked - set whether you can edit this object or not.
+ // Note: the timeline doesn't enforce this, it just stores
+ // a value for convenience.
+ // Get/SetDirtyRange -
+ // RemoveAll - remove this object, and if in the tree already, all it's
+ // sub objects, including children
+ // Remove - remove this object, and if in the tree already, all it's
+ // sub objects, but not kids
+ // GetTimelineNoRef - called internally by the timeline.
+ // GetGroupIBelongTo - called internally by the timeline.
+ // GetEmbedDepth - find out how many tracks we are a part of
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ local,
+ uuid(78530B77-61F9-11D2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineObj Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineObj : IUnknown
+{
+ [helpstring("method GetStartStop")]
+ HRESULT GetStartStop(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop);
+ [helpstring("method GetStartStop2")]
+ HRESULT GetStartStop2(REFTIME * pStart, REFTIME * pStop);
+ [helpstring("method FixTimes")]
+ HRESULT FixTimes(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop);
+ [helpstring("method FixTimes2")]
+ HRESULT FixTimes2(REFTIME * pStart, REFTIME * pStop);
+ [helpstring("method SetStartStop")]
+ HRESULT SetStartStop(REFERENCE_TIME Start, REFERENCE_TIME Stop);
+ [helpstring("method SetStartStop2")]
+ HRESULT SetStartStop2(REFTIME Start, REFTIME Stop);
+ [helpstring("method GetPropertySetter")]
+ HRESULT GetPropertySetter([out,retval] IPropertySetter* *pVal);
+ [helpstring("method SetPropertySetter")]
+ HRESULT SetPropertySetter(IPropertySetter* newVal);
+ [helpstring("method GetSubObject")]
+ HRESULT GetSubObject([out,retval] IUnknown* *pVal);
+ [helpstring("method SetSubObject")]
+ HRESULT SetSubObject(IUnknown* newVal);
+ [helpstring("method SetSubObjectGUID")]
+ HRESULT SetSubObjectGUID(GUID newVal);
+ [helpstring("method SetSubObjectGUIDByBSTR")]
+ HRESULT SetSubObjectGUIDB(BSTR newVal);
+ [helpstring("method GetSubObjectGUID")]
+ HRESULT GetSubObjectGUID(GUID * pVal);
+ [helpstring("method GetSubObjectGUIDByBSTR")]
+ HRESULT GetSubObjectGUIDB([out,retval] BSTR * pVal);
+ [helpstring("method GetSubObjectLoaded")]
+ HRESULT GetSubObjectLoaded(BOOL * pVal);
+ [helpstring("method GetTimelineType")]
+ HRESULT GetTimelineType(TIMELINE_MAJOR_TYPE * pVal);
+ [helpstring("method SetTimelineType")]
+ HRESULT SetTimelineType(TIMELINE_MAJOR_TYPE newVal);
+ [helpstring("method GetUserID")]
+ HRESULT GetUserID(long * pVal);
+ [helpstring("method SetUserID")]
+ HRESULT SetUserID(long newVal);
+ [helpstring("method GetGenID")]
+ HRESULT GetGenID( long * pVal );
+ [helpstring("method GetUserName")]
+ HRESULT GetUserName([out,retval] BSTR * pVal);
+ [helpstring("method SetUserName")]
+ HRESULT SetUserName(BSTR newVal);
+ [helpstring("method GetUserData")]
+ HRESULT GetUserData(BYTE * pData, long * pSize);
+ [helpstring("method SetUserData")]
+ HRESULT SetUserData(BYTE * pData, long Size);
+ [helpstring("method GetMuted")]
+ HRESULT GetMuted(BOOL * pVal);
+ [helpstring("method SetMuted")]
+ HRESULT SetMuted(BOOL newVal);
+ [helpstring("method GetLocked")]
+ HRESULT GetLocked(BOOL * pVal);
+ [helpstring("method SetLocked")]
+ HRESULT SetLocked(BOOL newVal);
+ [helpstring("method GetDirtyRange")]
+ HRESULT GetDirtyRange(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop);
+ [helpstring("method GetDirtyRange")]
+ HRESULT GetDirtyRange2(REFTIME * pStart, REFTIME * pStop);
+ [helpstring("method SetDirtyRange")]
+ HRESULT SetDirtyRange(REFERENCE_TIME Start, REFERENCE_TIME Stop);
+ [helpstring("method SetDirtyRange")]
+ HRESULT SetDirtyRange2(REFTIME Start, REFTIME Stop);
+ [helpstring("method ClearDirty")]
+ HRESULT ClearDirty( );
+ [helpstring("method Remove")]
+ HRESULT Remove();
+ [helpstring("method RemoveAll")]
+ HRESULT RemoveAll();
+ HRESULT GetTimelineNoRef( IAMTimeline ** ppResult );
+ HRESULT GetGroupIBelongTo( [out] IAMTimelineGroup ** ppGroup );
+ HRESULT GetEmbedDepth( long * pVal );
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Any object on the timeline that can have an effect put on it
+ // implements this interface. This includes sources, tracks, and
+ // compositions.
+ // explained methods:
+ // EffectInsBefore - insert an effect at the given priority onto
+ // this object. The effect's times will be clipped within
+ // this object's bounds. Use -1 to specify 'at the end' for priority.
+ // You cannot have two effects at the same priority.
+ // EffectSwapPriorities - swaparoo two effects. Makes undo easier to
+ // implement.
+ // EffectGetCount - get how many effects are applied to this object.
+ // GetEffect - get the nth effect applied to this object
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+[
+ object,
+ uuid(EAE58537-622E-11d2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineEffectable Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineEffectable : IUnknown
+{
+ [helpstring("method EffectInsBefore")]
+ HRESULT EffectInsBefore(IAMTimelineObj * pFX, long priority);
+ [helpstring("method EffectSwapPriorities")]
+ HRESULT EffectSwapPriorities(long PriorityA, long PriorityB);
+ [helpstring("method EffectGetCount")]
+ HRESULT EffectGetCount(long * pCount);
+ [helpstring("method GetEffect")]
+ HRESULT GetEffect([out] IAMTimelineObj ** ppFx, long Which);
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Any effect on the timeline will support at least this interface.
+ // NOTE: The Start/Stop times on this object are RELATIVE to their
+ // parent's, as are all start/stop times.
+ // explained methods:
+ // EffectGetPriority - finds out this effect's priority related to the others.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(BCE0C264-622D-11d2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineEffect Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineEffect : IUnknown
+{
+ [helpstring("method EffectGetPriority")]
+ HRESULT EffectGetPriority(long * pVal);
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Any object on the timeline that can have a transition put on it
+ // implements this interface
+ // explained methods:
+ // TransAdd - add a transition on this object. Multiple trans's on
+ // the same object cannot overlap in time. Transitions' times
+ // must lie within the bounds of their parent.
+ // TransGetCount - get how many transitions are applied to this
+ // object.
+ // GetNextTrans - given a time, get the next transition that happens
+ // on this object after that time. On exit, the input time is
+ // set to the start time of the transition.
+ // GetTransAtTime - find a transition forwards or backwards from
+ // a given spot. See DEXTERF_TRACK_SEARCH_FLAGS enum.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(378FA386-622E-11d2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineTransable Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineTransable : IUnknown
+{
+ [helpstring("method TransAdd")]
+ HRESULT TransAdd(IAMTimelineObj * pTrans);
+ [helpstring("method TransGetCount")]
+ HRESULT TransGetCount(long * pCount);
+ [helpstring("method GetNextTrans")]
+ HRESULT GetNextTrans([out] IAMTimelineObj ** ppTrans, REFERENCE_TIME * pInOut);
+ [helpstring("method GetNextTrans2")]
+ HRESULT GetNextTrans2([out] IAMTimelineObj ** ppTrans, REFTIME * pInOut);
+ [helpstring("method GetTransAtTime")]
+ HRESULT GetTransAtTime(
+ [out] IAMTimelineObj ** ppObj,
+ REFERENCE_TIME Time,
+ long SearchDirection );
+ [helpstring("method GetTransAtTime2")]
+ HRESULT GetTransAtTime2([out] IAMTimelineObj ** ppObj, REFTIME Time, long SearchDirection );
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Any object on the timeline that can be split into two will
+ // implement this interface. Namely, source, effects, and transitions
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(A0F840A0-D590-11d2-8D55-00A0C9441E20),
+ odl,
+ helpstring("IAMTimelineSplittable Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineSplittable : IUnknown
+{
+ HRESULT SplitAt(REFERENCE_TIME Time);
+ HRESULT SplitAt2(REFTIME Time);
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Any trans on the timeline will support at least this interface.
+ // NOTE: The Start/Stop times on this object are RELATIVE to their
+ // parent's, as are all start/stop times.
+ // explained methods:
+ // GetCutPoint - get where this transition should cut from A to B
+ // if the transition were not applied.
+ // GetA2B - get if this transition is to go from A->B or B->A.
+ // GetBackwards - get if this transition should run backwards.
+ // GetCutsOnly - force no transition, force doing a cut
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(BCE0C265-622D-11d2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineTrans Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineTrans : IUnknown
+{
+ [helpstring("method GetCutPoint")]
+ HRESULT GetCutPoint(REFERENCE_TIME * pTLTime);
+ [helpstring("method GetCutPoint2")]
+ HRESULT GetCutPoint2(REFTIME * pTLTime);
+ [helpstring("method SetCutPoint")]
+ HRESULT SetCutPoint(REFERENCE_TIME TLTime);
+ [helpstring("method SetCutPoint2")]
+ HRESULT SetCutPoint2(REFTIME TLTime);
+ [helpstring("method GetSwapInputs")]
+ HRESULT GetSwapInputs( BOOL * pVal );
+ [helpstring("method SetSwapInputs")]
+ HRESULT SetSwapInputs( BOOL pVal );
+ [helpstring("method GetCutsOnly")]
+ HRESULT GetCutsOnly( BOOL * pVal );
+ [helpstring("method SetCutsOnly")]
+ HRESULT SetCutsOnly( BOOL pVal );
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Sources represent any source media object on the timeline.
+ // They extend an IAMTimelineObj to include media start and stop
+ // times, a media name (which could represent darned near anything),
+ // and a StreamNumber, which defines which stream out of a potential
+ // many this stream represents from a source clip.
+ // explained methods:
+ // ModifyStopTime - like calling SetStartStop, but this method just
+ // adjusts the tail end of the clip.
+ // FixMediaTimes - called by the render engine to round times to
+ // this source clip's parent group's FPS.
+ // SpliceWithNext - if the next clip after this is the same source
+ // and this's stop time matches next's start time, the two
+ // will be joined.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(78530B79-61F9-11D2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineSrc Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineSrc : IUnknown
+{
+ [helpstring("method GetMediaTimes")]
+ HRESULT GetMediaTimes(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop);
+ [helpstring("method GetMediaTimes2")]
+ HRESULT GetMediaTimes2(REFTIME * pStart, REFTIME * pStop);
+ [helpstring("method ModifyStopTime")]
+ HRESULT ModifyStopTime(REFERENCE_TIME Stop);
+ [helpstring("method ModifyStopTime2")]
+ HRESULT ModifyStopTime2(REFTIME Stop);
+ [helpstring("method FixMediaTimes")]
+ HRESULT FixMediaTimes(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop);
+ [helpstring("method FixMediaTimes2")]
+ HRESULT FixMediaTimes2(REFTIME * pStart, REFTIME * pStop);
+ [helpstring("method SetMediaTimes")]
+ HRESULT SetMediaTimes(REFERENCE_TIME Start, REFERENCE_TIME Stop);
+ [helpstring("method SetMediaTimes2")]
+ HRESULT SetMediaTimes2(REFTIME Start, REFTIME Stop);
+ [helpstring("method SetMediaLength")]
+ HRESULT SetMediaLength(REFERENCE_TIME Length);
+ [helpstring("method SetMediaLength2")]
+ HRESULT SetMediaLength2(REFTIME Length);
+ [helpstring("method GetMediaLength")]
+ HRESULT GetMediaLength(REFERENCE_TIME * pLength);
+ [helpstring("method GetMediaLength2")]
+ HRESULT GetMediaLength2(REFTIME * pLength);
+ [helpstring("method GetMediaName")]
+ HRESULT GetMediaName([out,retval] BSTR * pVal);
+ [helpstring("method SetMediaName")]
+ HRESULT SetMediaName(BSTR newVal);
+ [helpstring("method SpliceWithNext")]
+ HRESULT SpliceWithNext(IAMTimelineObj * pNext);
+ [helpstring("method GetStreamNumber")]
+ HRESULT GetStreamNumber(long * pVal);
+ [helpstring("method SetStreamNumber")]
+ HRESULT SetStreamNumber(long Val);
+ HRESULT IsNormalRate( BOOL * pVal );
+
+ // If a source can't figure out its frames per second, this number
+ // will be used (eg: Dib sequences). AVI, MPEG, etc. will not need this
+ // Use 0 fps to prevent a filename like "ski4.jpg" from using a dib seq
+ [helpstring("method GetDefaultFPS")]
+ HRESULT GetDefaultFPS(double * pFPS);
+ [helpstring("method SetDefaultFPS")]
+ HRESULT SetDefaultFPS(double FPS);
+
+ // !!! This is video specific.. new interface?
+ // what kind of stretching? Stretch, crop, or preserve aspect ratio?
+ [helpstring("method GetStretchMode")]
+ HRESULT GetStretchMode(int * pnStretchMode);
+ [helpstring("method SetStretchMode")]
+ HRESULT SetStretchMode(int nStretchMode);
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Tracks are things that can contain media in them. You can add
+ // and remove sources, effects, and transitions from them. Sources
+ // are added according to the current insert mode of the timeline.
+ // If in OVERLAY mode, moving or adding a source to a time that's
+ // already occupied by another source will wipe out any overlapping
+ // portion of the underlying source. In InsertMode, everything at
+ // the insert point is moved down in time to make room for the
+ // new source.
+ // explained methods:
+ // SrcAdd - add the source to this track. The source's start/stop
+ // times must be set up first.
+ // GetNextSrc - pass a time in at which you wish to find a source
+ // and it will return the first source which occurs after the
+ // given time.
+ // MoveEverythingBy - bump a bunch of objects a certain direction
+ // on the track by a given time.
+ // GetSourcesCount - how many sources are on this track?
+ // AreYouBlank - do you contain anything at all?
+ // GetSrcAtTime - find a source at a given time. SearchDirection
+ // is which way to search. -1 = backwards, 1 = forwards
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(EAE58538-622E-11d2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineTrack Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineTrack : IUnknown
+{
+ [helpstring("method SrcAdd")]
+ HRESULT SrcAdd(IAMTimelineObj * pSource);
+ [helpstring("method GetNextSrc")]
+ HRESULT GetNextSrc([out] IAMTimelineObj ** ppSrc, REFERENCE_TIME * pInOut);
+ [helpstring("method GetNextSrc2")]
+ HRESULT GetNextSrc2([out] IAMTimelineObj ** ppSrc, REFTIME * pInOut);
+ [helpstring("method MoveEverythingBy")]
+ HRESULT MoveEverythingBy( REFERENCE_TIME Start, REFERENCE_TIME MoveBy );
+ [helpstring("method MoveEverythingBy2")]
+ HRESULT MoveEverythingBy2( REFTIME Start, REFTIME MoveBy );
+ [helpstring("method GetSourcesCount")]
+ HRESULT GetSourcesCount( long * pVal );
+ [helpstring("method AreYouBlank")]
+ HRESULT AreYouBlank( long * pVal );
+ [helpstring("method GetSrcAtTime")]
+ HRESULT GetSrcAtTime(
+ [out] IAMTimelineObj ** ppSrc,
+ REFERENCE_TIME Time,
+ long SearchDirection );
+ [helpstring("method GetSrcAtTime2")]
+ HRESULT GetSrcAtTime2([out] IAMTimelineObj ** ppSrc, REFTIME Time, long SearchDirection );
+ HRESULT InsertSpace( REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd );
+ HRESULT InsertSpace2( REFTIME rtStart, REFTIME rtEnd );
+ HRESULT ZeroBetween( REFERENCE_TIME rtStart, REFERENCE_TIME rtEnd );
+ HRESULT ZeroBetween2( REFTIME rtStart, REFTIME rtEnd );
+ HRESULT GetNextSrcEx(IAMTimelineObj * pLast, [out] IAMTimelineObj **ppNext);
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // This virtual track interface is shared by both the compositions
+ // and tracks (and groups).
+ // explained methods:
+ // TrackGetPriority - used by rendering objects which need to know this.
+ // SetTrackDirty - !!! not sure if this is useful.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(A8ED5F80-C2C7-11d2-8D39-00A0C9441E20),
+ odl,
+ helpstring("IAMTimelineVirtualTrack Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineVirtualTrack : IUnknown
+{
+ [helpstring("method TrackGetPriority")]
+ HRESULT TrackGetPriority(long * pPriority);
+ [helpstring("method SetTrackDirty")]
+ HRESULT SetTrackDirty( );
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Compositions are like tracks in the sense that they also
+ // implement IAMVirtualTrack and you can put transitions and effects
+ // on them, but they really are the SUM of those tracks that they
+ // contain. They are "embedded" compositions. They should only contain
+ // media of one particular type (like all video or all audio), but
+ // this is not enforced. You can add a composition to another
+ // composition with VTrackInsBefore, just like you can add a track.
+ // The very top composition to which all other comps and tracks belong
+ // is a Group, which supports I-AMTimelineGroup as well as I-AMTimelineComp.
+ // explained methods:
+ // VTrackInsBefore - does NOT mean VideoTrack. Means Virtual Track.
+ // Adds a virtual track to a composition at a given priority.
+ // use -1 to mean "at the end"
+ // VTrackSwapPriorities - switch two vtracks around.
+ // VTrackGetCount - get how many vtracks this comp contains.
+ // GetVTrack - you get the idea
+ // GetCountOfType - Get the total number of these objects this comp
+ // and all it's vtracks (recursively) contains. !!! this may be dead.
+ // GetRecursiveLayerOfType - given a number, returns a given track. This
+ // is done recursively. You need to pass in a pointer to the number,
+ // and it will be modified upon exit to an unknown value. DO NOT
+ // CALL THE VERSION WITH THE POINTER!
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(EAE58536-622E-11d2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimelineComp Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineComp : IUnknown
+{
+ [helpstring("method VTrackInsBefore")]
+ HRESULT VTrackInsBefore(IAMTimelineObj * pVirtualTrack, long Priority);
+ [helpstring("method VTrackSwapPriorities")]
+ HRESULT VTrackSwapPriorities(long VirtualTrackA, long VirtualTrackB);
+ [helpstring("method VTrackGetCount")]
+ HRESULT VTrackGetCount(long * pVal);
+ [helpstring("method GetVTrack")]
+ HRESULT GetVTrack([out] IAMTimelineObj ** ppVirtualTrack, long Which);
+ [helpstring("method GetCountOfType")]
+ HRESULT GetCountOfType(long * pVal, long * pValWithComps, TIMELINE_MAJOR_TYPE MajorType );
+ [helpstring("method GetRecursiveLayerOfType")]
+ HRESULT GetRecursiveLayerOfType(
+ [out] IAMTimelineObj ** ppVirtualTrack,
+ long WhichLayer,
+ TIMELINE_MAJOR_TYPE Type);
+ [helpstring("method GetRecursiveLayerOfTypeI (do not call)")]
+ HRESULT GetRecursiveLayerOfTypeI(
+ [out] IAMTimelineObj ** ppVirtualTrack,
+ [in,out] long * pWhichLayer,
+ TIMELINE_MAJOR_TYPE Type);
+ HRESULT GetNextVTrack(IAMTimelineObj *pVirtualTrack, [out] IAMTimelineObj **ppNextVirtualTrack);
+};
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // Groups represent the topmost composition in a timeline. Every
+ // group should contain media of only one major type (like all video).
+ // The timeline can contain multiple groups, see it's interface for
+ // this. Each group has a particular "media type" that you can get/set
+ // which help identify it. Each group has an associated FPS which
+ // is used by the render engine in setting up the big switch. All
+ // cuts on the timeline will happen rounded to this nearest FPS for
+ // this particular group. Each group has a priority which enables
+ // writing out multiple-stream files with 1 or more streams of the
+ // same type. (Like a 2 video stream AVI file).
+ // explained methods:
+ // SetTimeline - this is called internally when the group is added.
+ // Do not call this.
+ // GetTimeline - get the timeline this group belongs to.
+ // GetPriority - get this group's priority
+ // Get/SetOutputFPS - explained above
+ // SetMediaTypeForVB - method for VB. Pass in 0 for video, 1 for audio
+ // SetRecompFormatFromSource - set the recompress format based on the
+ // source that's loaded or set in the IAMTimelineSrc
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(9EED4F00-B8A6-11d2-8023-00C0DF10D434),
+ odl,
+ helpstring("IAMTimelineGroup Interface"),
+ pointer_default(unique)
+]
+interface IAMTimelineGroup : IUnknown
+{
+ [helpstring("method SetTimeline")]
+ HRESULT SetTimeline( IAMTimeline * pTimeline );
+ [helpstring("method GetTimeline")]
+ HRESULT GetTimeline( [out] IAMTimeline ** ppTimeline );
+ [helpstring("method GetPriority")]
+ HRESULT GetPriority( long * pPriority );
+ [helpstring("method GetMediaType")]
+ HRESULT GetMediaType([out] AM_MEDIA_TYPE *);
+ [helpstring("method SetMediaType")]
+ HRESULT SetMediaType([in] AM_MEDIA_TYPE *);
+ [helpstring("method SetOutputFPS")]
+ HRESULT SetOutputFPS(double FPS);
+ [helpstring("method GetOutputFPS")]
+ HRESULT GetOutputFPS(double * pFPS);
+ [helpstring("method SetGroupName")]
+ HRESULT SetGroupName( BSTR pGroupName );
+ [helpstring("method GetGroupName")]
+ HRESULT GetGroupName( [out,retval] BSTR * pGroupName );
+ // in preview mode, skip frames. In authoring mode, don't
+ [helpstring("method SetPreviewMode")]
+ HRESULT SetPreviewMode( BOOL fPreview );
+ [helpstring("method GetPreviewMode")]
+ HRESULT GetPreviewMode( BOOL *pfPreview );
+ [helpstring("method SetMediaTypeForVB")]
+ HRESULT SetMediaTypeForVB([in] long Val );
+ // how many frames ahead switch can run
+ [helpstring("method GetOutputBuffering")]
+ HRESULT GetOutputBuffering([out] int *pnBuffer );
+ [helpstring("method SetOutputBuffering")]
+ HRESULT SetOutputBuffering([in] int nBuffer );
+
+ HRESULT SetSmartRecompressFormat( long * pFormat );
+ HRESULT GetSmartRecompressFormat( long ** ppFormat );
+ HRESULT IsSmartRecompressFormatSet( BOOL * pVal );
+ HRESULT IsRecompressFormatDirty( BOOL * pVal );
+ HRESULT ClearRecompressFormatDirty( );
+ HRESULT SetRecompFormatFromSource( IAMTimelineSrc * pSource );
+};
+
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // The main timeline. This is the base object you use to set
+ // properties of the timeline as a whole, and to create blank
+ // objects for use within the timeline. You cannot create the
+ // objects using COM methods, you must go through the timeline to
+ // create this. That's because certain information is set before
+ // handing the object back to you. Every object created by the
+ // timeline will support at LEAST IAMTimelineObj. For any timeline,
+ // it can have one or more "groups" that it knows about. Each group
+ // has the capability to hold a complete sub-tree containing media
+ // that is all of one type. This logical seperation is used for the
+ // rendering engine, but is not strictly enforced.
+ // explained methods:
+ // CreateEmptyNode - pass in a mid type and it will pass back
+ // an object of the type you requested.
+ // AddGroup - add a created group to the tree
+ // RemGroupFromList - make sure timeline no longer knows about this group.
+ // does NOT do anything to the group itself. Normally the user
+ // does not want to call this, it's called from the Group's Remove( ) method.
+ // GetGroup - get a certain group
+ // GetGroupCount - get how many groups
+ // ClearAllGroups - clear everything
+ // GetInsertMode - ask what the insert mode is, overlay or insert
+ // SetInsertMode - set whether to insert or overlay
+ // EnableTransitions - turn transitions on or off as a whole
+ // EnableEffects - same deal.
+ // SetIntererstRange - discard sub-objects outside of a given
+ // time range, to save memory/resources
+ // Get/SetDefaultFPS - set the 'default' FPS for this timeline,
+ // the RenderEngine reads this information for setting itself up
+ // by default.
+ // GetCountOfType - ask for how many of a given thing are in a given
+ // group. !!! this may be a useless function.
+ // !!! not implemented
+ // IsDirty - asks if anything in the timeline needs to be redrawn
+ // GetDirtyRange - same deal
+ // ValidateSourceNames - make sure the filenames in the sources
+ // really exist. Use the same enum flags as the render engine
+ // uses for SetSourceNameValidation. Source's filenames will be
+ // changed to those of the found ones in the timeline.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+[
+ object,
+ uuid(78530B74-61F9-11D2-8CAD-00A024580902),
+ odl,
+ helpstring("IAMTimeline Interface"),
+ pointer_default(unique)
+]
+interface IAMTimeline : IUnknown
+{
+ [helpstring("method CreateEmptyNode")]
+ HRESULT CreateEmptyNode([out] IAMTimelineObj ** ppObj, TIMELINE_MAJOR_TYPE Type );
+ HRESULT AddGroup( IAMTimelineObj * pGroup );
+ HRESULT RemGroupFromList( IAMTimelineObj * pGroup );
+ HRESULT GetGroup( [out] IAMTimelineObj ** ppGroup, long WhichGroup );
+ HRESULT GetGroupCount( long * pCount );
+ HRESULT ClearAllGroups( );
+ HRESULT GetInsertMode( long * pMode );
+ [helpstring("method SetInsertMode")]
+ HRESULT SetInsertMode(long Mode);
+ [helpstring("method EnableTransitions")]
+ HRESULT EnableTransitions(BOOL fEnabled);
+ [helpstring("method TransitionsEnabled")]
+ HRESULT TransitionsEnabled(BOOL * pfEnabled);
+ [helpstring("method EnableEffects")]
+ HRESULT EnableEffects(BOOL fEnabled);
+ [helpstring("method EffectsEnabled")]
+ HRESULT EffectsEnabled(BOOL * pfEnabled);
+ [helpstring("method SetInterestRange")]
+ HRESULT SetInterestRange(REFERENCE_TIME Start, REFERENCE_TIME Stop);
+ [helpstring("method GetDuration")]
+ HRESULT GetDuration(REFERENCE_TIME * pDuration);
+ [helpstring("method GetDuration2")]
+ HRESULT GetDuration2(double * pDuration);
+ [helpstring("method SetDefaultFPS")]
+ HRESULT SetDefaultFPS(double FPS);
+ [helpstring("method GetDefaultFPS")]
+ HRESULT GetDefaultFPS(double * pFPS);
+ [helpstring("method IsDirty")]
+ HRESULT IsDirty(BOOL * pDirty);
+ [helpstring("method GetDirtyRange")]
+ HRESULT GetDirtyRange(REFERENCE_TIME * pStart, REFERENCE_TIME * pStop);
+ [helpstring("method GetCountOfType")]
+ HRESULT GetCountOfType(long Group, long * pVal, long * pValWithComps, TIMELINE_MAJOR_TYPE MajorType );
+ HRESULT ValidateSourceNames( long ValidateFlags, IMediaLocator * pOverride, LONG_PTR NotifyEventHandle );
+
+ HRESULT SetDefaultTransition( GUID * pGuid );
+ HRESULT GetDefaultTransition( GUID * pGuid );
+ HRESULT SetDefaultEffect( GUID * pGuid );
+ HRESULT GetDefaultEffect( GUID * pGuid );
+ HRESULT SetDefaultTransitionB( BSTR pGuid );
+ HRESULT GetDefaultTransitionB( [out,retval] BSTR * pGuid );
+ HRESULT SetDefaultEffectB( BSTR pGuid );
+ HRESULT GetDefaultEffectB( [out,retval] BSTR * pGuid );
+};
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+// XML STUFF --- XML STUFF --- XML STUFF --- XML STUFF --- XML
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// Xml2Dex - converts back and forth between XML and a dexter project
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+[
+ object,
+ uuid(18C628ED-962A-11D2-8D08-00A0C9441E20),
+ odl,
+ helpstring("IXml2Dex Interface"),
+ pointer_default(unique)
+]
+interface IXml2Dex : IDispatch
+{
+ [id(1), helpstring("method CreateGraphFromFile")]
+ HRESULT CreateGraphFromFile([out] IUnknown ** ppGraph, IUnknown * pTimeline, BSTR Filename);
+ [id(2), helpstring("method WriteGrfFile")]
+ HRESULT WriteGrfFile(IUnknown * pGraph, BSTR FileName);
+ [id(3), helpstring("method WriteXMLFile")]
+ HRESULT WriteXMLFile(IUnknown * pTimeline, BSTR FileName);
+ [id(5), helpstring("method ReadXMLFile")]
+ HRESULT ReadXMLFile(IUnknown *pTimeline, BSTR XMLName);
+ [id(6), helpstring("method Delete")]
+ HRESULT Delete(IUnknown *pTimeline, double dStart, double dEnd);
+ [id(7), helpstring("method WriteXMLPart")]
+ HRESULT WriteXMLPart(IUnknown * pTimeline, double dStart, double dEnd, BSTR FileName);
+ [id(8), helpstring("method PasteXMLFile")]
+ HRESULT PasteXMLFile(IUnknown * pTimeline, double dStart, BSTR FileName);
+ [id(9), helpstring("method CopyXML")]
+ HRESULT CopyXML(IUnknown * pTimeline, double dStart, double dEnd);
+ [id(10), helpstring("method PasteXML")]
+ HRESULT PasteXML(IUnknown * pTimeline, double dStart);
+ [id(11), helpstring("method Reset")]
+ HRESULT Reset( );
+ [id(12), helpstring("method ReadXML")]
+ HRESULT ReadXML(IUnknown *pTimeline, IUnknown *pXML);
+ [id(13), helpstring("method WriteXML")]
+ HRESULT WriteXML(IUnknown *pTimeline, BSTR *pbstrXML);
+};
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+// USEFUL HELPER INTERFACES
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// IAMErrorLog - an interface that receives error information from
+// a timeline or a render engine.
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+[
+ object,
+ uuid(E43E73A2-0EFA-11d3-9601-00A0C9441E20),
+ odl,
+ helpstring("IAMErrorLog Interface"),
+ pointer_default(unique)
+]
+interface IAMErrorLog : IUnknown
+{
+ [helpstring("method LogError")] HRESULT LogError(long Severity, BSTR pErrorString, long ErrorCode, long hresult, [in] VARIANT * pExtraInfo );
+};
+
+[
+ object,
+ uuid(963566DA-BE21-4eaf-88E9-35704F8F52A1),
+ odl,
+ helpstring("IAMSetErrorLog Interface"),
+ pointer_default(unique)
+]
+interface IAMSetErrorLog : IUnknown
+{
+ [propget, helpstring("property ErrorLog")] HRESULT ErrorLog([out, retval] IAMErrorLog * *pVal);
+ [propput, helpstring("property ErrorLog")] HRESULT ErrorLog([in] IAMErrorLog * newVal);
+};
+
+[
+ object,
+ uuid(0579154A-2B53-4994-B0D0-E773148EFF85),
+ local,
+ helpstring("ISampleGrabberCB Interface"),
+ pointer_default(unique)
+]
+interface ISampleGrabberCB : IUnknown
+{
+ HRESULT SampleCB( double SampleTime, IMediaSample * pSample );
+ HRESULT BufferCB( double SampleTime, BYTE * pBuffer, long BufferLen );
+}
+
+[
+ object,
+ uuid(6B652FFF-11FE-4fce-92AD-0266B5D7C78F),
+ local,
+ helpstring("ISampleGrabber Interface"),
+ pointer_default(unique)
+]
+interface ISampleGrabber: IUnknown
+{
+ // set this to have the filter immediate stop after
+ // garnishing a sample
+ //
+ HRESULT SetOneShot( BOOL OneShot );
+
+ // set what media type we connect to. It can be partially
+ // specified by setting only the major type, OR the major and
+ // subtype, OR major, subtype, and the formattype.
+ //
+ HRESULT SetMediaType( const AM_MEDIA_TYPE * pType );
+
+ // after something's connected to this filter, find out
+ // what it is
+ //
+ HRESULT GetConnectedMediaType( AM_MEDIA_TYPE * pType );
+
+ // call this to buffer incoming samples, so the next two methods will work
+ // If this is not called, the next two methods will return
+ // E_INVALIDARG
+ //
+ HRESULT SetBufferSamples( BOOL BufferThem );
+
+ // pass in NULL for pBuffer to get out the buffer size you need to
+ // allocate. This will NOT return a pointer to a compressed dib
+ // any longer! It will return the IMediaSample's GetPointer buffer.
+ //
+ HRESULT GetCurrentBuffer( [in,out] long * pBufferSize, [out] long * pBuffer );
+
+ // return the currently buffered sample
+ //
+ HRESULT GetCurrentSample( [out,retval] IMediaSample ** ppSample );
+
+ // if this callback is set, then it will be called for
+ // every sample passing through the filter. Do not take a long time
+ // in the callback for smooth playback (obviously!)
+ //
+ HRESULT SetCallback( ISampleGrabberCB * pCallback, long WhichMethodToCallback );
+};
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+// THE LIBRARY ITSELF
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+
+[
+ uuid(78530B68-61F9-11D2-8CAD-00A024580902),
+ version(1.0),
+ helpstring("Dexter 1.0 Type Library")
+]
+library DexterLib
+{
+ importlib("stdole2.tlb");
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // resize the input video to an output size, for uniformity within DES.
+ // DES will set the output media type and probably also put_Size. By setting
+ // the output media type, DES is stating the resizer must produce only that
+ // media type on the output pin, unless it is succeeded by a put_Size call.
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ [
+ object,
+ uuid(4ada63a0-72d5-11d2-952a-0060081840bc),
+ odl,
+ helpstring("IResize Interface"),
+ pointer_default(unique)
+ ]
+ interface IResize : IUnknown
+ {
+ HRESULT get_Size([out] int *piHeight, [out] int *piWidth, [out] long *pFlag);
+ HRESULT get_InputSize([out] int *piHeight, [out] int *piWidth);
+ HRESULT put_Size([in] int Height, [in] int Width, [in] long Flag);
+ HRESULT get_MediaType([out] AM_MEDIA_TYPE *pmt);
+ HRESULT put_MediaType([in] const AM_MEDIA_TYPE *pmt);
+ };
+
+ [
+ uuid(78530B75-61F9-11D2-8CAD-00A024580902),
+ helpstring("AMTimeline Class")
+ ]
+ coclass AMTimeline
+ {
+ [default] interface IAMTimeline;
+ interface IPersistStream;
+ interface IAMSetErrorLog;
+ };
+
+ [
+ uuid(78530B78-61F9-11D2-8CAD-00A024580902),
+ helpstring("IAMTimelineObj Class")
+ ]
+ coclass AMTimelineObj
+ {
+ [default] interface IAMTimelineObj;
+ };
+
+ [
+ uuid(78530B7A-61F9-11D2-8CAD-00A024580902),
+ helpstring("IAMTimelineSrc Class")
+ ]
+ coclass AMTimelineSrc
+ {
+ [default] interface IAMTimelineSrc;
+ interface IAMTimelineObj;
+ interface IAMTimelineEffectable;
+ interface IAMTimelineSplittable;
+ };
+
+ [
+ uuid(8F6C3C50-897B-11d2-8CFB-00A0C9441E20),
+ ]
+ coclass AMTimelineTrack
+ {
+ [default] interface IAMTimelineTrack;
+ interface IAMTimelineObj;
+ interface IAMTimelineEffectable;
+ interface IAMTimelineTransable;
+ interface IAMTimelineVirtualTrack;
+ interface IAMTimelineSplittable;
+ };
+
+ [
+ uuid(74D2EC80-6233-11d2-8CAD-00A024580902),
+ ]
+ coclass AMTimelineComp
+ {
+ [default] interface IAMTimelineComp;
+ interface IAMTimelineObj;
+ interface IAMTimelineEffectable;
+ interface IAMTimelineTransable;
+ interface IAMTimelineVirtualTrack;
+ };
+
+ [
+ uuid(F6D371E1-B8A6-11d2-8023-00C0DF10D434),
+ ]
+ coclass AMTimelineGroup
+ {
+ [default] interface IAMTimelineGroup;
+ interface IAMTimelineComp;
+ interface IAMTimelineObj;
+ };
+
+ [
+ uuid(74D2EC81-6233-11d2-8CAD-00A024580902),
+ ]
+ coclass AMTimelineTrans
+ {
+ [default] interface IAMTimelineTrans;
+ interface IAMTimelineObj;
+ interface IAMTimelineSplittable;
+ };
+
+ [
+ uuid(74D2EC82-6233-11d2-8CAD-00A024580902),
+ ]
+ coclass AMTimelineEffect
+ {
+ [default] interface IAMTimelineEffect;
+ interface IAMTimelineObj;
+ interface IAMTimelineSplittable;
+ interface IPropertyBag;
+ };
+
+ [
+ uuid(64D8A8E0-80A2-11d2-8CF3-00A0C9441E20),
+ ]
+ coclass RenderEngine
+ {
+ [default] interface IRenderEngine;
+ interface IRenderEngine2;
+ interface IAMSetErrorLog;
+ };
+
+ [
+ uuid(498B0949-BBE9-4072-98BE-6CCAEB79DC6F),
+ ]
+ coclass SmartRenderEngine
+ {
+ [default] interface IRenderEngine;
+ interface ISmartRenderEngine;
+ interface IAMSetErrorLog;
+ };
+
+ [
+ uuid(036A9790-C153-11d2-9EF7-006008039E37),
+ ]
+ coclass AudMixer
+ {
+ [default] interface IBaseFilter;
+ };
+
+ [
+ uuid(18C628EE-962A-11D2-8D08-00A0C9441E20),
+ helpstring("Xml2Dex Class")
+ ]
+ coclass Xml2Dex
+ {
+ [default] interface IXml2Dex;
+ };
+
+ [
+ uuid(CC1101F2-79DC-11D2-8CE6-00A0C9441E20),
+ helpstring("MediaLocator Class")
+ ]
+ coclass MediaLocator
+ {
+ [default] interface IMediaLocator;
+ };
+
+ [
+ uuid(ADF95821-DED7-11d2-ACBE-0080C75E246E),
+ helpstring("Varying Property Holder")
+ ]
+ coclass PropertySetter
+ {
+ [default] interface IPropertySetter;
+ interface IAMSetErrorLog;
+ };
+
+ [
+ uuid(65BD0711-24D2-4ff7-9324-ED2E5D3ABAFA),
+ helpstring("MediaDet Class")
+ ]
+ coclass MediaDet
+ {
+ [default] interface IMediaDet;
+ };
+
+ [
+ uuid(C1F400A0-3F08-11d3-9F0B-006008039E37),
+ helpstring("MsGrab Class")
+ ]
+ coclass SampleGrabber
+ {
+ [default] interface ISampleGrabber;
+ };
+
+ // useful for movie maker and other people
+ [
+ uuid(C1F400A4-3F08-11d3-9F0B-006008039E37),
+ helpstring("NullRenderer Class")
+ ]
+ coclass NullRenderer
+ {
+ [default] interface IBaseFilter;
+ };
+
+ [
+ uuid(BB44391D-6ABD-422f-9E2E-385C9DFF51FC),
+ helpstring("DxtCompositor Class")
+ ]
+ coclass DxtCompositor
+ {
+ [default] interface IDxtCompositor;
+ };
+
+ [
+ uuid(506D89AE-909A-44f7-9444-ABD575896E35),
+ helpstring("DxtAlphaSetter Class")
+ ]
+ coclass DxtAlphaSetter
+ {
+ [default] interface IDxtAlphaSetter;
+ };
+
+ [
+ uuid(DE75D012-7A65-11D2-8CEA-00A0C9441E20),
+ helpstring("SMPTE wipe DXT")
+ ]
+ coclass DxtJpeg
+ {
+ [default] interface IDxtJpeg;
+ };
+
+ [
+ uuid(0cfdd070-581a-11d2-9ee6-006008039e37),
+ ]
+ coclass ColorSource
+ {
+ [default] interface IBaseFilter;
+ };
+
+ [
+ uuid(C5B19592-145E-11d3-9F04-006008039E37),
+ helpstring("DxtKey Class")
+ ]
+ coclass DxtKey
+ {
+ [default] interface IDxtKey;
+ };
+};
+
+// these are some error codes that we can/will return
+enum
+{
+ E_NOTINTREE = 0x80040400,
+ E_RENDER_ENGINE_IS_BROKEN = 0x80040401,
+ E_MUST_INIT_RENDERER = 0x80040402,
+ E_NOTDETERMINED = 0x80040403,
+ E_NO_TIMELINE = 0x80040404,
+ S_WARN_OUTPUTRESET = 40404
+};
+
+// These codes are given to the app in IAMErrorLog to help identify what went wrong
+
+// Filename doesn't exist, or DShow doesn't recognize the filetype
+// EXTRA - filename
+cpp_quote("#define DEX_IDS_BAD_SOURCE_NAME 1400")
+
+// Filename doesn't exist or contains unknown data
+// EXTRA - filename (maybe no codec?)
+cpp_quote("#define DEX_IDS_BAD_SOURCE_NAME2 1401")
+
+// filename was required, but wasn't given
+cpp_quote("#define DEX_IDS_MISSING_SOURCE_NAME 1402")
+
+// cannot parse data provided by this source
+// !!! what source?
+cpp_quote("#define DEX_IDS_UNKNOWN_SOURCE 1403")
+
+// unexpected error - some DShow component not installed correctly
+cpp_quote("#define DEX_IDS_INSTALL_PROBLEM 1404")
+
+// Source filter does not accept filenames
+// !!! What source?
+cpp_quote("#define DEX_IDS_NO_SOURCE_NAMES 1405")
+
+// The group's mediatype is not supported
+// EXTRA - gives you an integer group number
+cpp_quote("#define DEX_IDS_BAD_MEDIATYPE 1406")
+
+// Invalid stream number for a source
+// EXTRA - gives the stream number !!! should identify which source!
+cpp_quote("#define DEX_IDS_STREAM_NUMBER 1407")
+
+// You ran out of memory
+cpp_quote("#define DEX_IDS_OUTOFMEMORY 1408")
+
+// One bitmap in a sequence was not the same type as the others
+// EXTRA - gives the bitmap name
+cpp_quote("#define DEX_IDS_DIBSEQ_NOTALLSAME 1409")
+
+// Clip's mediatimes are invalid, or DibSeq too short, or a previous error caused this
+// !!! Needs to give the clip name
+cpp_quote("#define DEX_IDS_CLIPTOOSHORT 1410")
+
+// Clsid of FX/Transition is not a DirectX Transform
+// EXTRA - gives the CLSID
+cpp_quote("#define DEX_IDS_INVALID_DXT 1411")
+
+// Default FX/Transition Clsid is not a DirectX Transform"
+// EXTRA - gives the CLSID
+cpp_quote("#define DEX_IDS_INVALID_DEFAULT_DXT 1412")
+
+// Your version of DX doesn't support 3D transforms"
+// EXTRA - gives the CLSID of the 3D transform you tried to use
+cpp_quote("#define DEX_IDS_NO_3D 1413")
+
+// This DirectX Transform is not the right kind, or is broken
+// EXTRA - gives the CLSID of the broken transform
+cpp_quote("#define DEX_IDS_BROKEN_DXT 1414")
+
+// No such property exists on an object
+// EXTRA - gives the name of the property (if given as a string)
+cpp_quote("#define DEX_IDS_NO_SUCH_PROPERTY 1415")
+
+// Illegal value for a property
+// EXTRA - gives the VARIANT value that was illegal
+cpp_quote("#define DEX_IDS_ILLEGAL_PROPERTY_VAL 1416")
+
+// Syntax error in XML file at line:
+// EXTRA - gives I4 line number, if available
+cpp_quote("#define DEX_IDS_INVALID_XML 1417")
+
+// Can't find filter specified in XML by Category and Instance
+// EXTRA - gives friendly name (instance)
+cpp_quote("#define DEX_IDS_CANT_FIND_FILTER 1418")
+
+// Disk error writing XML file
+cpp_quote("#define DEX_IDS_DISK_WRITE_ERROR 1419")
+
+// Clsid not a valid DShow audio effect filter
+// EXTRA - gives the CLSID
+cpp_quote("#define DEX_IDS_INVALID_AUDIO_FX 1420")
+
+// Cannot find compressor for smart recompression type
+cpp_quote("#define DEX_IDS_CANT_FIND_COMPRESSOR 1421")
+
+
+
+// !!! Here go problems hooking up sources or finding codecs
+
+
+// THE FOLLOWING SHOULD NEVER HAPPEN - please call me if they do
+
+// Unexpected error in parsing the timeline
+cpp_quote("#define DEX_IDS_TIMELINE_PARSE 1426")
+// Unexpected error building the filtergraph
+cpp_quote("#define DEX_IDS_GRAPH_ERROR 1427")
+// Unexpected error with the internal grid
+cpp_quote("#define DEX_IDS_GRID_ERROR 1428")
+// Unexpected error getting an interface
+cpp_quote("#define DEX_IDS_INTERFACE_ERROR 1429")
+
+// these are the enumeration categories for effects
+//
+cpp_quote("EXTERN_GUID(CLSID_VideoEffects1Category, 0xcc7bfb42, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);")
+cpp_quote("EXTERN_GUID(CLSID_VideoEffects2Category, 0xcc7bfb43, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);")
+cpp_quote("EXTERN_GUID(CLSID_AudioEffects1Category, 0xcc7bfb44, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);")
+cpp_quote("EXTERN_GUID(CLSID_AudioEffects2Category, 0xcc7bfb45, 0xf175, 0x11d1, 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59);")
+
diff --git a/dxsdk/Include/DShowIDL/regbag.idl b/dxsdk/Include/DShowIDL/regbag.idl
new file mode 100644
index 00000000..103aff17
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/regbag.idl
@@ -0,0 +1,52 @@
+//------------------------------------------------------------------------------
+// File: RegBag.idl
+//
+// Desc: IDL source for RegBag.dll.
+//
+// Copyright (c) 1999 - 2000, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Microsoft Windows")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2000.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("#pragma once")
+
+#ifndef DO_NO_IMPORTS
+import "objidl.idl";
+import "oaidl.idl";
+import "ocidl.idl";
+#endif
+
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////
+//
+// Custom Factory interface
+// since com doesn't support ctors or initialization parameters on std factory interface
+// we have a custom creation interface
+//
+///////////////////////////////////////////////////////////////////////////////
+//*****************************************************************************
+///////////////////////////////////////////////////////////////////////////////////////
+[object,
+ hidden, restricted,
+ uuid(8A674B48-1F63-11d3-B64C-00C04F79498E),
+ helpstring("Create property bag backed by registry"),
+ pointer_default(unique),
+ local
+]
+interface ICreatePropBagOnRegKey : IUnknown {
+ // NOTE: it is up to the caller to set the correct registry access based on the interface
+ // and methods the caller intends to use
+ // IPropertyBag2::GetPropertyInfo and CountProperties require both KEY_QUERY_VALUE and KEY_ENUMERATE_SUBKEYS
+ // IPropertyBagXXX::Read requires KEY_READ
+ // IPropertyBagXXX::Write requires KEY_WRITE
+ // also, you must CoTaskMemFree the name string from GetPropertyInfo
+ // if you write a value of VT_EMPTY or VT_NULL the property will be removed from the bag and the corresponding
+ // registry info will be deleted.
+ HRESULT Create([in] HKEY hkey, [in] LPCOLESTR subkey, [in] DWORD ulOptions, [in] DWORD samDesired, REFIID iid, [out] LPVOID *ppBag);
+};
+
diff --git a/dxsdk/Include/DShowIDL/sbe.idl b/dxsdk/Include/DShowIDL/sbe.idl
new file mode 100644
index 00000000..246b148c
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/sbe.idl
@@ -0,0 +1,1348 @@
+
+/*++
+
+ Copyright (c) 2002 Microsoft Corporation
+
+ Module Name:
+
+ sbe.idl
+
+ Abstract:
+
+ This module the StreamBuffer interface definitions & CLSIDs, public
+
+--*/
+
+import "unknwn.idl" ;
+import "wtypes.idl" ;
+import "objidl.idl";
+import "strmif.idl" ;
+
+// ============================================================================
+
+// interfaces
+interface IStreamBufferSink ; // locking & recording
+interface IStreamBufferSink2 ; // ext locking
+interface IStreamBufferSink3 ; // specify the minimum
+interface IStreamBufferSource ; // associates with IStreamBufferSink
+interface IStreamBufferRecordControl ; // recording control
+interface IStreamBufferRecordingAttribute ; // StreamBuffer attribute creation
+interface IEnumStreamBufferRecordingAttrib ; // StreamBuffer attribute enumeration
+interface IStreamBufferConfigure ; // configuration interface
+interface IStreamBufferConfigure2 ; // configuration interface; more
+interface IStreamBufferMediaSeeking ; // IMediaSeeking but with different GUID
+interface IStreamBufferMediaSeeking2 ; // + available filter & frame rate on FF/RW
+interface IStreamBufferPolicy ; // StreamBuffer policies
+interface IStreamBufferInitialize ; // allows 3rd party app to set HKEY
+interface IStreamBufferDataCounters ; // collect data rate from the pins
+
+[
+ object,
+ uuid(9ce50f2d-6ba7-40fb-a034-50b1a674ec78),
+ pointer_default(unique)
+]
+[local] interface IStreamBufferInitialize : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetHKEY ()
+
+ Implemented on StreamBufferStreamSink and StreamBufferSource filters.
+ Gives a hosting application the ability to specify HKEY root in
+ registry. This method must called **early**: after the filter is
+ instantiated, but before StreamBufferSource is locked (explicitly or
+ implicitely) if calling the method on StreamBufferSource, or before
+ a source is set (via IStreamBufferSource or IFileSourceFilter) if
+ calling the method on StreamBufferStreamSource. If a call is made
+ after either filter has been initialized internally, the call will
+ fail with E_UNEXPECTED. The hosting application is responsible for
+ ensuring that the HKEY passed in is writable & readable per the
+ logged-on user privileges. The HKEY is duplicated internally,
+ so the caller can close it after making this call.
+ --*/
+ HRESULT
+ SetHKEY (
+ [in] HKEY hkeyRoot
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetSIDs ()
+
+ Implemented on StreamBufferStreamSink and StreamBufferSource filters.
+ Provides a way for the hosting application to specify security-level
+ sharing between capture and render processes and contexts. By
+ default security attributes are inherited from the hosting process,
+ unless the application overrides the defaults and provides them via
+ this method.
+ --*/
+ HRESULT
+ SetSIDs (
+ [in] DWORD cSIDs,
+ [in, size_is (cSIDs)] PSID * ppSID
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSink
+
+ Stream Source interface;
+ implemented on the StreamBufferSink filter;
+ Only way to get a recorder object's IUnknown (object will subsequently
+ be associated with this Sink)
+--*/
+
+enum {
+ RECORDING_TYPE_CONTENT = 0, // no post-recording or overlapped
+ RECORDING_TYPE_REFERENCE, // allows post-recording & overlapped
+} ;
+
+[
+ object,
+ uuid(afd1f242-7efd-45ee-ba4e-407a25c9a77a),
+ pointer_default(unique)
+]
+interface IStreamBufferSink : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ LockProfile ()
+
+ 1. Locks the profile;
+ 2. No *new* input pin connections will be accepted;
+ 3. Existing pins that are, or have ever been, connected can be
+ reconnected if the media type is exactly the same as the first
+ successful connection;
+ 4. Can be called multiple times with the same parameter as the initial
+ LockProfile() call was made with i.e. more than once with NULL if
+ initially locked with NULL, or more than once with a string if
+ initially locked with a string; if the profile is already locked,
+ and the parameters are the same, returns S_FALSE, else the call
+ fails (if trying to lock a locked profile with a different
+ parameter)
+ 5. Must be called before the filter that implements this interface is
+ ever run; when it is run, it locks implicitely and this method has
+ no effect if called with NULL parameters, or fails if called with
+ non-NULL parameter for the reasons listed above;
+ 6. Errors with VFW_E_UNSUPPORTED_STREAM if there are no streams in the
+ profile;
+
+ Parameter Detail
+ ----------------
+
+ pszStreamBufferFilename
+
+ Is a NULL-terminated filename string. If the content written by
+ this sink is to be shared cross-process, this parameter specifies a
+ filename that will be opened by any reader(s) to read & render the
+ content sent into the sink.
+
+ Can be NULL (not specified)
+
+ Must be a full-path filename; if no path is specified, the file is
+ created in a "current" directory
+
+ If the file already exists, the call fails
+
+ Is opened with DELETE_ON_CLOSE flag, so is automatically deleted
+ when the sink is unlocked, or when the hosting process terminates
+ --*/
+ HRESULT
+ LockProfile (
+ [in] LPCWSTR pszStreamBufferFilename
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ CreateRecorder ()
+
+ 1. Returns a *new* recorder object's IUnknown;
+ 2. Caller can call QueryInterface() on the returned pointer to get
+ interface pointers to configure & control the recording;
+ 3. Returned IUnknown pointer is ref'd & must be Release()'d by the
+ caller
+ 4. IStreamBufferSink interface must have been locked (explicitely or
+ implicitely) prior to call
+
+ To create an ordinary recording, specify RECORDING_TYPE_CONTENT for the
+ dwRecordType parammeter. This will record the content directly into
+ the specified file. These recording types only accept start and stop
+ times that occur in the future.
+
+ A recording of type RECORDING_TYPE_REFERENCE generates a small file
+ that references content saved in temporary storage. Recordings of this
+ type can have start and stop times that occurs in the past, and can
+ overlap other same-type recordings.
+
+ Reference recording *content* will be saved in the same subdirectory as
+ the specified reference file, but with hidden and system attributes.
+ The naming convention of the files will append a _1.sbe, _2.sbe, etc...
+ to the filename (minus extension) specified in the call e.g. a
+ "seinfeld01.sbe" reference file will have saved content in hidden
+ and system files "seinfeld01_1.sbe", "seinfeld01_2.sbe", etc...
+
+ --*/
+ HRESULT
+ CreateRecorder (
+ [in] LPCWSTR pszFilename,
+ [in] DWORD dwRecordType, // RECORDING_TYPE_CONTENT or RECORDING_TYPE_REFERENCE
+ [out] IUnknown ** pRecordingIUnknown
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ IsProfileLocked ()
+
+ 1. Returns S_OK if the profile is locked and S_FALSE if it is not.
+ 2. Returns E_FAIL on error.
+ --*/
+ HRESULT
+ IsProfileLocked (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSink2 ()
+
+ Stream Source interface;
+ implemented on the StreamBufferSink filter;
+--*/
+[
+ object,
+ uuid(DB94A660-F4FB-4bfa-BCC6-FE159A4EEA93),
+ pointer_default(unique)
+]
+interface IStreamBufferSink2 : IStreamBufferSink
+{
+ /*++
+ ------------------------------------------------------------------------
+ UnlockProfile ()
+
+ 1. Unlocks a profile explicitely.
+ 2. Is a noop if the sink is not locked & returns S_FALSE.
+ 3. Can only be called when the graph & filter are stopped.
+ 4. Since recordings are bound to the "lock session", incomplete
+ recordings i.e. those that have never been started, are
+ invalidated & must be re-created under the next "lock session".
+ 5. Profile still unlocks implicitly when the filter is stopped.
+ --*/
+ HRESULT
+ UnlockProfile (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSink3 ()
+
+ Stream Source interface;
+ implemented on the StreamBufferSink filter;
+--*/
+[
+ object,
+ uuid(974723f2-887a-4452-9366-2cff3057bc8f),
+ pointer_default(unique)
+]
+interface IStreamBufferSink3 : IStreamBufferSink2
+{
+ /*++
+ -----------------------------------------------------------------------
+ SetAvailableFilter ()
+
+ Bounds the minimum. This affects readers so they cannot seek past
+ the specified minimum.
+
+ Parameter Detail
+ ----------------
+
+ prtMin
+
+ min time relative to "now"
+
+ cannot be NULL
+
+ [in]: time, specified relative to the last sample written, to set
+ as the minimum time available to readers; valid values are <= 0;
+ use -MAXLONGLONG if all the backing store should be made available.
+
+ [out]: actual min time; if the [in] value further back than what is
+ available, the [out] value will be set to the actual time made
+ available.
+
+ Return Values
+ -------------
+
+ success S_OK
+
+ failure error code
+ --*/
+ HRESULT
+ SetAvailableFilter (
+ [in, out] REFERENCE_TIME * prtMin
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSource ()
+
+ Stream Source reader interface;
+ Implemented on the StreamBufferSource filter;
+--*/
+[
+ object,
+ uuid(1c5bd776-6ced-4f44-8164-5eab0e98db12),
+ pointer_default(unique)
+]
+interface IStreamBufferSource : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetStreamSink ()
+
+ 1. Sets the StreamBuffer Sink that streams from this Source;
+ 2. IStreamBufferSink object must be in the same process as this object;
+ 3. Interface is AddRef()'d if the call succeeds;
+
+ Parameter Detail
+ ----------------
+
+ pIStreamBufferSink
+
+ Sink that will stream to this Source
+ --*/
+ HRESULT
+ SetStreamSink (
+ [in] IStreamBufferSink * pIStreamBufferSink
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferRecordControl
+
+ obtained by QIing IStreamBufferSink::CreateRecorder()-returned IUnknown *
+--*/
+[
+ object,
+ uuid(ba9b6c99-f3c7-4ff2-92db-cfdd4851bf31),
+ pointer_default(unique)
+]
+interface IStreamBufferRecordControl : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ Start ()
+
+ 1. Starts a recording;
+ 2. Will save to the filename that is specified when this interface's
+ IUnknown is requested (IStreamBufferSink::CreateRecorder());
+
+ Parameter Detail
+ ----------------
+
+ rtStart
+
+ Start time relative to "now;
+
+ If the recording type is a content recording, can only refer to
+ seconds in the future; allowed seconds are [0,5]
+
+ If the recording type is a reference recording, can refer to any
+ time that still has valid content i.e. content that has not yet
+ become stale
+
+ If the recording is a reference recording and (* prtStart) is
+ earlier than the earliest still-valid content, the call will reset
+ it to the earliest content; the value when the recording was
+ actually started will be [out]
+ --*/
+ HRESULT
+ Start (
+ [in,out] REFERENCE_TIME * prtStart
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Stop ()
+
+ 1. Stops a recording;
+ 2. Closes out the file;
+
+ Parameter Detail
+ ----------------
+
+ rtStart
+
+ Stop time relative to "now;
+
+ If the recording type is a content recording, can only refer to
+ seconds in the future; allowed seconds are [0,5]
+
+ If the recording type is a reference recording, can refer to any
+ time that still has valid content i.e. content that has not yet
+ become stale; stop time cannot be <= start time
+ --*/
+ HRESULT
+ Stop (
+ [in] REFERENCE_TIME rtStop
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetRecordingStatus ()
+
+ 1. Retrieves the status of the recording
+
+ Parameter Detail
+ ----------------
+
+ phResult
+
+ The (current) status of writing or closing the recording file;
+
+ Can be NULL;
+
+ pbStarted
+
+ If supplied, set to a non-zero value if the recording has been
+ started
+
+ Can be NULL;
+
+ pbStopped
+
+ If supplied, set to a non-zero value if the recording has been
+ stopped;
+
+ Can be NULL;
+
+ NOTE: If the recording has never been started, it will not be flagged
+ as stopped.
+
+ --*/
+ HRESULT
+ GetRecordingStatus (
+ [out] HRESULT * phResult,
+ [out] BOOL * pbStarted,
+ [out] BOOL * pbStopped
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferRecComp
+
+ CoCreateInstance CLSID_StreamBufferComposeRecording and QueryInterface for
+ this interface; this interface allows the creation of a single target
+ content recording which consists of a number of concatenated recordings
+ (reference or content; can mix & match if desired)
+--*/
+
+[
+ object,
+ uuid(9E259A9B-8815-42ae-B09F-221970B154FD),
+ pointer_default(unique)
+]
+interface IStreamBufferRecComp : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ Initialize ()
+
+ 1. Initializes for a target recording
+
+ Parameter Detail
+ ----------------
+
+ pszTargetFilename
+
+ Sets the target filename
+
+ Fails if the file already exists
+
+ pszSBRecProfileRef
+
+ Must be a completed, SBE-generated recording
+
+ This recording's profile will be used to define the target profile
+
+ Appended files must have exactly the same profile
+ --*/
+ HRESULT
+ Initialize (
+ [in] LPCWSTR pszTargetFilename,
+ [in] LPCWSTR pszSBRecProfileRef
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Append ()
+
+ 1. appends an entire recording
+ 2. fails if the recording is live
+ --*/
+ HRESULT
+ Append (
+ [in] LPCWSTR pszSBRecording
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ AppendEx ()
+
+ 1. appends the specified portion of the recording; the parameters must
+ be accurate; the call will not readjust them within the boundaries
+ 2. the time spread must be at least 2 seconds
+ 3. fails if the recording is live
+ --*/
+ HRESULT
+ AppendEx (
+ [in] LPCWSTR pszSBRecording,
+ [in] REFERENCE_TIME rtStart,
+ [in] REFERENCE_TIME rtStop
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetCurrentLength ()
+
+ 1. returns the current length of the recording; updates as recordings
+ are appended;
+ 2. can be called repeatedly during a Append() call on another
+ thread;
+ --*/
+ HRESULT
+ GetCurrentLength (
+ [out] DWORD * pcSeconds
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Close ()
+
+ 1. explicitely closes the recording
+
+ 2. final release of interface closes the recording as well
+ --*/
+ HRESULT
+ Close (
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Cancel ()
+
+ 1. cancels an in-progress appending operation; has no effect otherwise
+ --*/
+ HRESULT
+ Cancel (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferRecordingAttribute
+
+ obtained by calling QueryInterface on a recorder
+
+ well-known attributes:
+
+ NAME DESCRIPTION
+ ------------------- ----------------------------------------------------
+
+ Title String containing the content title.
+
+ Author String containing the name of the content author.
+
+ Description String containing a description of the content.
+
+ Rating String containing a content rating.
+
+ Copyright String containing a content copyright message.
+
+ Duration Quadruple word value containing the playing duration
+ of the file, in 100-nanosecond units.
+
+ Bitrate Double word value containing the bit rate.
+
+ Seekable Boolean value; true denoting that the content is
+ seekable.
+
+ Stridable Boolean value, true denoting that the content is
+ stridable (fast forward and rewind are enabled).
+
+ Broadcast Boolean value; true denoting that the content is not
+ copyright-protected, and can be broadcast.
+
+ Use_DRM reserved
+
+ DRM_Flags reserved
+
+ DRM_Level reserved
+
+ Is_Protected reserved
+
+ Is_Trusted reserved
+
+ Signature_Name reserved
+
+ HasAudio Boolean, true denoting the content includes an
+ audio stream.
+
+ HasImage Boolean, true denoting the content includes a still
+ image stream (such as JPEG images).
+
+ HasScript Boolean, true denoting the content includes a script
+ stream.
+
+ HasVideo Boolean, true denoting the content includes a video
+ stream.
+
+ CurrentBitrate Double word containing the current total bitrate,
+ usually used for MEB (multi-bit rate) streams.
+
+ OptimalBitrate Double word containing the minimum total bitrate
+ recommended to stream the content and get
+ maximum quality.
+
+ WM/AlbumTitle String containing the album title.
+
+ WM/Track Double word containing the track number.
+
+ WM/PromotionURL String with a URL to an HTML page that contains
+ information about products and events (such as
+ concerts) that are related to this music.
+
+ WM/AlbumCoverURL String with a URL to an HTML page that contains an
+ image of the album cover and information about
+ the album.
+
+ WM/Genre String with the genre of the music.
+
+ WM/Year String with the year of publication of the music.
+
+ WM/GenreID
+
+ WM/MCDI
+
+ BannerImageType One member of the WMT_ATTR_IMAGETYPE enumeration
+ type.
+
+ BannerImageData The actual image data: a bitmap, JPEG, or GIF image.
+
+
+ BannerImageURL If the banner image is clicked on then this URL is
+ activated.
+
+ CopyrightURL An URL to a copyright page.
+
+ NSC_Name String containing the multicast station contact
+ name (read-only).
+
+ NSC_Address String containing the multicast station contact
+ address (read-only).
+
+ NSC_Phone String containing the multicast station contact
+ phone number (read-only).
+
+ NSC_Email String containing the multicast station contact
+ email address (read-only).
+
+ NSC_Description String containing the multicast station contact
+ description (read-only).
+
+--*/
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// List of pre-defined attributes " )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingDuration[] =L\"Duration\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBitrate[] =L\"Bitrate\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSeekable[] =L\"Seekable\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingStridable[] =L\"Stridable\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBroadcast[] =L\"Broadcast\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingProtected[] =L\"Is_Protected\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTrusted[] =L\"Is_Trusted\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSignature_Name[] =L\"Signature_Name\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasAudio[] =L\"HasAudio\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasImage[] =L\"HasImage\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasScript[] =L\"HasScript\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasVideo[] =L\"HasVideo\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingCurrentBitrate[] =L\"CurrentBitrate\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingOptimalBitrate[] =L\"OptimalBitrate\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasAttachedImages[] =L\"HasAttachedImages\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSkipBackward[] =L\"Can_Skip_Backward\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSkipForward[] =L\"Can_Skip_Forward\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNumberOfFrames[] =L\"NumberOfFrames\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingFileSize[] =L\"FileSize\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasArbitraryDataStream[] =L\"HasArbitraryDataStream\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasFileTransferStream[] =L\"HasFileTransferStream\";" )
+cpp_quote( "" )
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// The content description object supports 5 basic attributes." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTitle[] =L\"Title\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAuthor[] =L\"Author\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingDescription[] =L\"Description\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingRating[] =L\"Rating\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingCopyright[] =L\"Copyright\";" )
+cpp_quote( "" )
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// These attributes are used to configure DRM using IWMDRMWriter::SetDRMAttribute." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR *g_wszStreamBufferRecordingUse_DRM = L\"Use_DRM\";" )
+cpp_quote( "static const WCHAR *g_wszStreamBufferRecordingDRM_Flags = L\"DRM_Flags\";" )
+cpp_quote( "static const WCHAR *g_wszStreamBufferRecordingDRM_Level = L\"DRM_Level\";" )
+cpp_quote( "" )
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// These are the additional attributes defined in the WM attribute" )
+cpp_quote( "// namespace that give information about the content." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAlbumTitle[] =L\"WM/AlbumTitle\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTrack[] =L\"WM/Track\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingPromotionURL[] =L\"WM/PromotionURL\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAlbumCoverURL[] =L\"WM/AlbumCoverURL\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingGenre[] =L\"WM/Genre\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingYear[] =L\"WM/Year\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingGenreID[] =L\"WM/GenreID\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingMCDI[] =L\"WM/MCDI\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingComposer[] =L\"WM/Composer\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingLyrics[] =L\"WM/Lyrics\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTrackNumber[] =L\"WM/TrackNumber\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingToolName[] =L\"WM/ToolName\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingToolVersion[] =L\"WM/ToolVersion\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingIsVBR[] =L\"IsVBR\";" )
+
+//
+// WM/AlbumArtist is a potentially different value than Author
+//
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAlbumArtist[] =L\"WM/AlbumArtist\";" )
+cpp_quote( "" )
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// These optional attributes may be used to give information " )
+cpp_quote( "// about the branding of the content." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBannerImageType[] =L\"BannerImageType\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBannerImageData[] =L\"BannerImageData\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBannerImageURL[] =L\"BannerImageURL\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingCopyrightURL[] =L\"CopyrightURL\";" )
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// Optional attributes, used to give information " )
+cpp_quote( "// about video stream properties." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAspectRatioX[] =L\"AspectRatioX\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAspectRatioY[] =L\"AspectRatioY\";" )
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// The NSC file supports the following attributes." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCName[] =L\"NSC_Name\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCAddress[] =L\"NSC_Address\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCPhone[] =L\"NSC_Phone\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCEmail[] =L\"NSC_Email\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCDescription[] =L\"NSC_Description\";" )
+cpp_quote( "" )
+
+//
+// StreamBuffer Attribute datatypes;
+//
+typedef enum {
+ STREAMBUFFER_TYPE_DWORD = 0,
+ STREAMBUFFER_TYPE_STRING = 1,
+ STREAMBUFFER_TYPE_BINARY = 2,
+ STREAMBUFFER_TYPE_BOOL = 3,
+ STREAMBUFFER_TYPE_QWORD = 4,
+ STREAMBUFFER_TYPE_WORD = 5,
+ STREAMBUFFER_TYPE_GUID = 6,
+} STREAMBUFFER_ATTR_DATATYPE ;
+
+[
+ object,
+ uuid(16CA4E03-FE69-4705-BD41-5B7DFC0C95F3),
+ pointer_default(unique)
+]
+interface IStreamBufferRecordingAttribute : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetAttribute ()
+
+ 1. Sets an attribute on a recording object;
+ 2. Fails if the IStreamBufferRecordControl::Start has already been successfully
+ called;
+ 3. If an attribute of the same name already exists, overwrites the old;
+ --*/
+ HRESULT
+ SetAttribute (
+ [in] ULONG ulReserved,
+ [in] LPCWSTR pszAttributeName,
+ [in] STREAMBUFFER_ATTR_DATATYPE StreamBufferAttributeType,
+ [in, size_is (cbAttributeLength)] BYTE * pbAttribute,
+ [in] WORD cbAttributeLength
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetAttributeCount ()
+
+ 1. Returns the count of attributes currently set;
+ --*/
+ HRESULT
+ GetAttributeCount (
+ [in] ULONG ulReserved,
+ [out] WORD * pcAttributes
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetAttributeByName ()
+
+ 1. Given a name, returns the attribute data;
+ 2. If the provided buffer is too small, returns VFW_E_BUFFER_OVERFLOW,
+ and (* pcbLength) contains the minimum required length of the buffer
+ 3. To learn the length of the attribute, pass in non-NULL pcbLength,
+ and NULL pbAttribute parameter; [out] value will be the length of
+ the attribute
+ --*/
+ HRESULT
+ GetAttributeByName (
+ [in] LPCWSTR pszAttributeName,
+ [in] ULONG * pulReserved,
+ [out] STREAMBUFFER_ATTR_DATATYPE * pStreamBufferAttributeType,
+ [out, size_is (* pcbLength)] BYTE * pbAttribute,
+ [in, out] WORD * pcbLength
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetAttributeByIndex ()
+
+ 1. Given an 0-based index, returns the attribute name and data
+ 2. If either buffer is too small, returns VFW_E_BUFFER_OVERFLOW, and
+ (* pcbLength) and (* pcchNameLength) contain the minimum required
+ length of each buffer
+ 3. The length returned by pcchNameLength includes the null-terminator
+ 4. To learn the length of the name & attribute, pass in non-NULL
+ pcchNameLength & pcbLength, and NULL pszAttributeName & pbAttribute
+ parameters; [out] value of the non-NULL parameters will be the
+ lengths of the name and attribute
+ --*/
+ HRESULT
+ GetAttributeByIndex (
+ [in] WORD wIndex,
+ [in] ULONG * pulReserved,
+ [out] WCHAR * pszAttributeName,
+ [in, out] WORD * pcchNameLength, // includes NULL-terminator; in BYTES
+ [out] STREAMBUFFER_ATTR_DATATYPE * pStreamBufferAttributeType,
+ [out, size_is (* pcbLength)] BYTE * pbAttribute,
+ [in, out] WORD * pcbLength
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ EnumAttributes ()
+
+ 1. Returns a StreamBuffer attribute enumeration object that snapshots
+ the attributes at time-of-call
+ --*/
+ HRESULT
+ EnumAttributes (
+ [out] IEnumStreamBufferRecordingAttrib ** ppIEnumStreamBufferAttrib
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IEnumStreamBufferRecordingAttrib
+
+ obtained by calling IStreamBufferRecordingAttribute::EnumAttributes, or
+ calling clone on this interface
+--*/
+
+typedef struct {
+ LPWSTR pszName ; // allocated by callee; freed by caller
+ STREAMBUFFER_ATTR_DATATYPE StreamBufferAttributeType ;
+ BYTE * pbAttribute ; // allocated by callee; freed by caller
+ WORD cbLength ;
+} STREAMBUFFER_ATTRIBUTE ;
+
+[
+ object,
+ uuid (C18A9162-1E82-4142-8C73-5690FA62FE33),
+ pointer_default(unique)
+]
+interface IEnumStreamBufferRecordingAttrib : IUnknown
+{
+ HRESULT
+ Next (
+ [in] ULONG cRequest,
+ [in, out, size_is (cRequest)] STREAMBUFFER_ATTRIBUTE * pStreamBufferAttribute,
+ [out] ULONG * pcReceived
+ ) ;
+
+ HRESULT
+ Skip (
+ [in] ULONG cRecords
+ ) ;
+
+ HRESULT
+ Reset (
+ ) ;
+
+ HRESULT
+ Clone (
+ [out] IEnumStreamBufferRecordingAttrib ** ppIEnumStreamBufferAttrib
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferConfigure
+
+--*/
+[
+ object,
+ uuid(ce14dfae-4098-4af7-bbf7-d6511f835414),
+ pointer_default(unique)
+]
+interface IStreamBufferConfigure : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetStreamBufferDirectory ()
+
+ 1. Sets the directory where all content is saved, ringbuffer &
+ StreamBuffer;
+ 2. Creates directory if necessary;
+ 3. All TEMP files have hidden+system attributes
+ --*/
+ HRESULT
+ SetDirectory (
+ [in] LPCWSTR pszDirectoryName
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetStreamBufferDirectory ()
+
+ 1. Retrieves previously set backing store directory, or default
+ location if none was specified
+ --*/
+ HRESULT
+ GetDirectory (
+ [out] LPWSTR * ppszDirectoryName
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetBackingFileCount ()
+
+ 1. Sets the number of backing files
+ 2. valid values
+
+ 4 <= min <= 100
+ 6 <= max <= 102
+ min max delta >= 2
+ --*/
+ HRESULT
+ SetBackingFileCount (
+ [in] DWORD dwMin,
+ [in] DWORD dwMax
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetBackingFileCount ()
+
+ 1. Retrieves previously set backing file counts, or defaults if none
+ have have been set
+ --*/
+ HRESULT
+ GetBackingFileCount (
+ [out] DWORD * pdwMin,
+ [out] DWORD * pdwMax
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetEachBackingFileDuration ()
+
+ 1. Sets the seconds of content each backing file will hold
+ 2. valid values:
+
+ dwSeconds >= 15
+ --*/
+ HRESULT
+ SetBackingFileDuration (
+ [in] DWORD dwSeconds
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetEachBackingFileDuration ()
+
+ 1. Retrieves previously set backing file duration, or default of none
+ is set
+ --*/
+ HRESULT
+ GetBackingFileDuration (
+ [out] DWORD * pdwSeconds
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferConfigure2
+
+--*/
+[
+ object,
+ uuid(53E037BF-3992-4282-AE34-2487B4DAE06B),
+ pointer_default(unique)
+]
+interface IStreamBufferConfigure2 : IStreamBufferConfigure
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetMultiplexedPacketSize ()
+
+ 1. sets the size of the target multiplexed packet size
+ 2. valid values:
+
+ 8192 <= cbBytesPerPacket <= 65535
+
+ This is useful if low-bitrate streams are used, and the time to fill a
+ multiplexed packet is excessive when the default value of 65535 bytes
+ is used.
+ --*/
+ HRESULT
+ SetMultiplexedPacketSize (
+ [in] DWORD cbBytesPerPacket
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetMultiplexedPacketSize ()
+
+ 1. gets the size of the target multiplexed packet size
+ --*/
+ HRESULT
+ GetMultiplexedPacketSize (
+ [out] DWORD * pcbBytesPerPacket
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetFFTransitionRates ()
+
+ 1. sets the fast forward (FF) rates for which the Stream Buffer Engine
+ transitions from FullFrame to KeyFrame to KeyFrame + Seeks.
+ 2. valid values:
+
+ 1 < dwMaxFullFrameRate < dwMaxNonSkippingRate
+
+ FF playback transitions from full-frame play, then to all keyframes,
+ then to keyframes + seekaheads. This method allows the transition
+ rates to be set. By default they are 4 and 6. If the rate is in (0,4]
+ all the frames are sent to the codec. If the rate is in (4,6] just
+ keyframes are sent. If the rate is > 6, then only keyframes are sent,
+ and a seekahead between keyframes is used that is proportionally
+ aggressive to the specified rate.
+ --*/
+ HRESULT
+ SetFFTransitionRates (
+ [in] DWORD dwMaxFullFrameRate,
+ [in] DWORD dwMaxNonSkippingRate
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetFFTransitionRates ()
+
+ 1. gets the fast forward (FF) rates for which the Stream Buffer Engine
+ transitions from FullFrame to KeyFrame to KeyFrameWithSeeks.
+ --*/
+ HRESULT
+ GetFFTransitionRates (
+ [out] DWORD * pdwMaxFullFrameRate,
+ [out] DWORD * pdwMaxNonSkippingRate
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferMediaSeeking
+
+ Implemented on the StreamBufferSource filter. Used to seek and set the
+ playback rate.
+
+--*/
+
+[
+ object,
+ uuid(f61f5c26-863d-4afa-b0ba-2f81dc978596),
+ pointer_default(unique)
+]
+interface IStreamBufferMediaSeeking : IMediaSeeking
+{
+ // no additional methods have been added
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferMediaSeeking2
+
+ Implemented on the StreamBufferSource filter. Used to seek and set the
+ playback rate.
+
+--*/
+
+[
+ object,
+ uuid(3a439ab0-155f-470a-86a6-9ea54afd6eaf),
+ pointer_default(unique)
+]
+interface IStreamBufferMediaSeeking2 : IStreamBufferMediaSeeking
+{
+ /*++
+ -----------------------------------------------------------------------
+ SetRateEx ()
+
+ Allows the application to override SBE's trick mode seekahead
+ computation.
+
+ The specified frame rate will, on average, be correct, but may
+ have some variance if averaged over short periods of time. This is
+ due to the content's compression schema.
+
+ The frame rate is applied to the video stream, if one exists. If no
+ video stream exists, the rate call fails. The framerate parameter
+ (dwFramesPerSec) is ignored when the specified abs(rate) is less than or
+ equal to the maximum non-skipping rate (see IStreamBufferConfigure2::
+ SetFFTransitionRates ()).
+
+ Parameter Detail
+ ----------------
+
+ dRate rate at which the content is to be played.
+ valid values are all rates, excluding the following
+ range: (-0.1, 0.1)
+
+ dwFramesPerSec frames per second
+ cannot be 0
+ SBE does not enforce this parameter with respect to
+ the screen refresh rate
+ ignored if the abs(dRate) value is <= max non-
+ skipping rate (see IStreamBufferConfigure2::
+ SetFFTransitionRates ()).
+
+ Return Values
+ -------------
+
+ success S_OK
+
+ failure error code
+ --*/
+ HRESULT
+ SetRateEx (
+ [in] double dRate,
+ [in] DWORD dwFramesPerSec
+ ) ;
+} ;
+
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferDataCounters
+
+ Implemented on the StreamBufferSource & StreamBufferSink filter pins. Used
+ to get instantaneous traffic counters for the pin.
+
+--*/
+
+typedef struct {
+ ULONGLONG cDataBytes ; // total sample payload bytes
+ ULONGLONG cSamplesProcessed ; // samples processed
+ ULONGLONG cDiscontinuities ; // number of discontinuities
+ ULONGLONG cSyncPoints ; // number of syncpoints
+ ULONGLONG cTimestamps ; // number of timestamps
+} SBE_PIN_DATA ;
+
+[
+ object,
+ uuid(9D2A2563-31AB-402e-9A6B-ADB903489440),
+ pointer_default(unique)
+]
+interface IStreamBufferDataCounters : IUnknown
+{
+ // retrieves the instantaneous values in the data structure
+ HRESULT
+ GetData (
+ [out] SBE_PIN_DATA * pPinData
+ ) ;
+
+ // sets all the data structure values to 0
+ HRESULT
+ ResetData (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ events
+--*/
+
+// see evcode.h comment for range
+// stream buffer engine (PVR) 0x0326 - 0x0350 (sbe.idl)
+
+cpp_quote ("#define STREAMBUFFER_EC_BASE 0x0326")
+
+cpp_quote ("enum {")
+cpp_quote (" // timehole event")
+cpp_quote (" // param1 = timehole stream offset ms")
+cpp_quote (" // param1 = timehole size ms")
+cpp_quote (" STREAMBUFFER_EC_TIMEHOLE = STREAMBUFFER_EC_BASE,")
+cpp_quote (" ")
+cpp_quote (" STREAMBUFFER_EC_STALE_DATA_READ,")
+cpp_quote (" ")
+cpp_quote (" STREAMBUFFER_EC_STALE_FILE_DELETED,")
+cpp_quote (" STREAMBUFFER_EC_CONTENT_BECOMING_STALE,")
+cpp_quote (" STREAMBUFFER_EC_WRITE_FAILURE,")
+cpp_quote (" //")
+cpp_quote (" // unexpected read failure")
+cpp_quote (" // param1 = HRESULT failure")
+cpp_quote (" // param2 = undefined")
+cpp_quote (" STREAMBUFFER_EC_READ_FAILURE,")
+cpp_quote (" //")
+cpp_quote (" // playback rate change")
+cpp_quote (" // param1 = old_playback_rate * 10000 e.g. 2x is 20000")
+cpp_quote (" // param2 = new_playback_rate * 10000")
+cpp_quote (" STREAMBUFFER_EC_RATE_CHANGED,")
+cpp_quote ("} ;")
+
+/*++
+ ============================================================================
+ ============================================================================
+ trick mode
+
+ We've extended the 1.0 interfaces as follows:
+
+ 1. source filter presents timestamps that monotonically increase overtime
+
+ 2. flushes should have no effect over queued rate segments
+
+ 3. discontinuities have no effect over queued rate segments
+
+ To use the interface, continue to use AM_KSPROPSETID_TSRateChange, but use
+ dwPropId that is higher
+
+--*/
+
+#ifdef USE_AM_PROPERTY_TS_RATE_CHANGE_11
+cpp_quote ("typedef enum {")
+cpp_quote (" AM_RATE_UseRateVersion = AM_RATE_Step + 1,")
+cpp_quote (" AM_RATE_QueryFullFrameRate,")
+cpp_quote (" AM_RATE_QueryLastRateSegPTS")
+cpp_quote ("} AM_PROPERTY_TS_RATE_CHANGE_11 ;")
+
+// AM_RATE_QueryRate; this is the max full-frame rate; source filter can use
+// up to this; it can use less
+cpp_quote ("typedef struct {")
+cpp_quote (" LONG lMaxForwardFullFrame ; // rate * 10000")
+cpp_quote (" LONG lMaxReverseFullFrame ; // rate * 10000")
+cpp_quote ("} AM_QueryRate ;")
+#endif // USE_AM_PROPERTY_TS_RATE_CHANGE_11
+
+/*
+================================================================================
+AM_RATE_UseRateVersion
+--------------------------------------------------------------------------------
+Specifies the rate change version to be used.
+
+The default behavior should be per 1.0.
+
+Use a WORD value. The high-order byte specifies the minor version (revision)
+number; the low-order byte specifies the major version number. On a
+little-endian system (e.g. x86), the WORD value version for the contents of
+this specification is 0x0101.
+
+If the specified rate version is not supported, the call should fail with
+an E_NOINTERFACE error code.
+
+================================================================================
+AM_RATE_QueryFullFrameRate
+--------------------------------------------------------------------------------
+Allows a source filter to query for maximum full-frame rates the timestamp
+scaling filter is capable of. Maximum full-frame forward and reverse rates
+are queried for.
+
+Use AM_QueryRate structure. Timestamp scaling filter must set
+lMaxReverseFullFrame struct member to negative rate.
+
+The sourcing filter can still choose to set the full-frame rate to a value
+smaller than the value returned by the timestamp scaling filter. For example,
+there may be IO issues that prevent a full-frame playback, even if the timestamp
+scaling filter is capable.
+
+Non-full frame playback will consist of groups of continuous samples sent to
+the timestamp scaling filter, separated by discontinuities. The timestamps for
+each group of samples will jump across the discontinuities, but still increase
+per the RunTimePlus timeline, when compared to RenderTime, once a steady state
+runstate has been achieved.
+
+Note that Rate is used this call, vs. speed.
+
+================================================================================
+AM_RATE_QueryLastRateSegPTS
+--------------------------------------------------------------------------------
+Allows a source filter to query the timestamp scaling filter for the last-set
+rate-segment's effective PTS, regardless of rate-segment position.
+
+Note that Rate is used this call, vs. speed.
+
+================================================================================
+AM_RATE_SimpleRateChange (with 1.1 semantics)
+--------------------------------------------------------------------------------
+If the rate is to be set to the most forward sample, the
+AM_SimpleRateChange.StartTime member is set to value -1 by the sourcing filter.
+This has meaning to the timestamp scaling filter to set the rate to the most
+forward sample, and return that sample's presentation time via the method call's
+[out] parameter.
+
+If the specified rate segment is incompatible, all queued samples with PTS in
+rate-incompatible segment can be discarded.
+
+If the current rate is incompatible i.e. samples are being dropped by the
+timestamp scaling filter and it is not keeping an internal queued, it should
+fail the querying call (AM_SimpleRateChagne.StartTime = -1) with return error
+VFW_E_DVD_WRONG_SPEED. The sourcing filter will then set a rate with an
+effective PTS.
+
+*/
+
diff --git a/dxsdk/Include/DShowIDL/strmif.idl b/dxsdk/Include/DShowIDL/strmif.idl
new file mode 100644
index 00000000..87da1d8b
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/strmif.idl
@@ -0,0 +1,51 @@
+//------------------------------------------------------------------------------
+// File: StrmIf.idl
+//
+// Desc: ActiveMovie interface definitions.
+//
+// Copyright (c) 1992 - 2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+//
+// Temporarily disable the /W4 compiler warning C4201, which will be
+// reported by all apps which include streams.h or dshow.h, which both
+// include the strmif.h generated by this IDL file.
+//
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2002.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("// Disable /W4 compiler warning C4201: nameless struct/union")
+cpp_quote("#pragma warning(push)")
+cpp_quote("#pragma warning(disable:4201) // Disable C4201: nameless struct/union")
+cpp_quote(" ") // Blank space
+
+
+import "unknwn.idl";
+import "objidl.idl"; // for IPersist (IFilter's root)
+
+#include "devenum.idl"
+
+// core interfaces
+#include "axcore.idl"
+
+// extended, ActiveMovie-only interfaces
+#include "axextend.idl"
+
+// application interfaces for DVD
+#include "dvdif.idl"
+
+// Dynamic graph stuff
+#include "dyngraph.idl"
+
+
+// Video Mixing Renderer
+#include "VMRender.idl"
+
+
+//
+// Restore the previous setting for C4201 compiler warning
+//
+cpp_quote("// Restore the previous setting for C4201 compiler warning")
+cpp_quote("#pragma warning(pop)")
diff --git a/dxsdk/Include/DShowIDL/tuner.idl b/dxsdk/Include/DShowIDL/tuner.idl
new file mode 100644
index 00000000..75f1beb4
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/tuner.idl
@@ -0,0 +1,2254 @@
+//------------------------------------------------------------------------------
+// File: Tuner.idl
+//
+// Desc:
+//
+// Copyright (c) 1999 - 2000, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+cpp_quote("//+-------------------------------------------------------------------------")
+cpp_quote("//")
+cpp_quote("// Microsoft Windows")
+cpp_quote("// Copyright (C) Microsoft Corporation, 1999-2000.")
+cpp_quote("//")
+cpp_quote("//--------------------------------------------------------------------------")
+cpp_quote("#pragma once")
+
+#include <olectl.h>
+#ifndef DO_NO_IMPORTS
+import "oaidl.idl";
+import "comcat.idl";
+import "strmif.idl";
+import "bdatypes.h";
+import "regbag.idl";
+#endif
+
+cpp_quote("#include <bdatypes.h>")
+
+interface ITuningSpaceContainer;
+interface ITuningSpace;
+interface IEnumTuningSpaces;
+interface ITuneRequest;
+interface ITuner;
+interface IScanningTuner;
+interface IEnumComponentTypes;
+interface IComponentTypes;
+interface IComponentType;
+interface ILanguageComponentType;
+interface IEnumComponents;
+interface IComponents;
+interface IComponent;
+interface IMPEG2ComponentType;
+interface IMPEG2Component;
+interface ILocator;
+interface IATSCLocator;
+interface IDVBSLocator;
+interface IDVBTLocator;
+interface IDVBCLocator;
+
+// tuner.idl:
+// interface ITuningSpaceContainer : IDispatch
+// interface ITuningSpace : IDispatch
+// interface ITuneRequest : IDispatch
+// interface IComponentType : IDispatch
+// interface ILanguageComponentType : IComponentType
+// interface IComponentTypes : IDispatch
+// interface IComponent : IDispatch
+// interface IComponents : IDispatch
+// interface ITVTuningSpace : ITuningSpace
+// interface IFMRadioTuningSpace : ITuningSpace
+// interface IAMRadioTuningSpace : ITuningSpace
+// interface IAnalogTVTuningSpace : ITVTuningSpace
+// interface IAnalogTVAudioComponent : IComponent
+// interface IAnalogTVDataComponent : IComponent
+// interface IChannelTuneRequest : ITuneRequest
+// interface IDVBComponent : IComponent
+// interface IDVBTuneRequest : ITuneRequest
+
+// DISPIDs for ITuningSpaces interface
+// we don't expect to inherit from this interface and consequently there's
+// no chance of collision, thus we'll allow midl to auto assign ids for this one
+
+// DISPIDs for ITuningSpace interface
+enum {
+DISPID_TUNER_TS_UNIQUENAME = 1,
+DISPID_TUNER_TS_FRIENDLYNAME = 2,
+DISPID_TUNER_TS_CLSID = 3,
+DISPID_TUNER_TS_NETWORKTYPE = 4,
+DISPID_TUNER_TS__NETWORKTYPE = 5,
+DISPID_TUNER_TS_CREATETUNEREQUEST = 6,
+DISPID_TUNER_TS_ENUMCATEGORYGUIDS = 7,
+DISPID_TUNER_TS_ENUMDEVICEMONIKERS = 8,
+DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES = 9,
+DISPID_TUNER_TS_FREQMAP = 10,
+DISPID_TUNER_TS_DEFLOCATOR = 11,
+DISPID_TUNER_TS_CLONE = 12,
+
+// DISPIDs for ITuneRequest interface
+DISPID_TUNER_TR_TUNINGSPACE = 1,
+DISPID_TUNER_TR_COMPONENTS = 2,
+DISPID_TUNER_TR_CLONE = 3,
+DISPID_TUNER_TR_LOCATOR = 4,
+
+
+// DISPID for IComponentType interface
+DISPID_TUNER_CT_CATEGORY = 1,
+DISPID_TUNER_CT_MEDIAMAJORTYPE = 2,
+DISPID_TUNER_CT__MEDIAMAJORTYPE = 3,
+DISPID_TUNER_CT_MEDIASUBTYPE = 4,
+DISPID_TUNER_CT__MEDIASUBTYPE = 5,
+DISPID_TUNER_CT_MEDIAFORMATTYPE = 6,
+DISPID_TUNER_CT__MEDIAFORMATTYPE = 7,
+DISPID_TUNER_CT_MEDIATYPE = 8,
+DISPID_TUNER_CT_CLONE = 9,
+
+
+// DISPID for ILanguageComponentType interface
+DISPID_TUNER_LCT_LANGID = 100,
+
+// DISPID for IMPEG2ComponentType interface
+DISPID_TUNER_MP2CT_TYPE = 200,
+
+// DISPID for IATSCComponentType interface
+DISPID_TUNER_ATSCCT_FLAGS = 300,
+
+// DISPID for ILocator interface
+DISPID_TUNER_L_CARRFREQ = 1,
+DISPID_TUNER_L_INNERFECMETHOD = 2,
+DISPID_TUNER_L_INNERFECRATE = 3,
+DISPID_TUNER_L_OUTERFECMETHOD = 4,
+DISPID_TUNER_L_OUTERFECRATE = 5,
+DISPID_TUNER_L_MOD = 6,
+DISPID_TUNER_L_SYMRATE = 7,
+DISPID_TUNER_L_CLONE = 8,
+
+// DISPID for IATSCLocator interface
+DISPID_TUNER_L_ATSC_PHYS_CHANNEL = 201,
+DISPID_TUNER_L_ATSC_TSID = 202,
+
+// DISPID for IDVBTLocator interface
+DISPID_TUNER_L_DVBT_BANDWIDTH = 301,
+DISPID_TUNER_L_DVBT_LPINNERFECMETHOD = 302,
+DISPID_TUNER_L_DVBT_LPINNERFECRATE = 303,
+DISPID_TUNER_L_DVBT_GUARDINTERVAL = 304,
+DISPID_TUNER_L_DVBT_HALPHA = 305,
+DISPID_TUNER_L_DVBT_TRANSMISSIONMODE = 306,
+DISPID_TUNER_L_DVBT_INUSE = 307,
+
+// DISPID for IDVBSLocator interface
+DISPID_TUNER_L_DVBS_POLARISATION = 401,
+DISPID_TUNER_L_DVBS_WEST = 402,
+DISPID_TUNER_L_DVBS_ORBITAL = 403,
+DISPID_TUNER_L_DVBS_AZIMUTH = 404,
+DISPID_TUNER_L_DVBS_ELEVATION = 405,
+
+// DISPID for IDVBCLocator interface
+
+// DISPIDs for IComponent interface
+DISPID_TUNER_C_TYPE = 1,
+DISPID_TUNER_C_STATUS = 2,
+DISPID_TUNER_C_LANGID = 3,
+DISPID_TUNER_C_DESCRIPTION = 4,
+DISPID_TUNER_C_CLONE = 5,
+
+// DISPIDs for IMPEG2Component interface
+DISPID_TUNER_C_MP2_PID = 101,
+DISPID_TUNER_C_MP2_PCRPID = 102,
+DISPID_TUNER_C_MP2_PROGNO = 103,
+
+// DISPIDs for IDVBTuningSpace interface
+DISPID_TUNER_TS_DVB_SYSTEMTYPE = 101,
+// DISPIDs for IDVBTuningSpace2 interface
+DISPID_TUNER_TS_DVB2_NETWORK_ID = 102,
+// DISPIDs for IDVBSTuningSpace interface
+DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ = 1001,
+DISPID_TUNER_TS_DVBS_HI_OSC_FREQ = 1002,
+DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ = 1003,
+DISPID_TUNER_TS_DVBS_INPUT_RANGE = 1004,
+DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION = 1005,
+
+// DISPIDs for IAnalogRadioTuningSpace interface
+DISPID_TUNER_TS_AR_MINFREQUENCY = 101,
+DISPID_TUNER_TS_AR_MAXFREQUENCY = 102,
+DISPID_TUNER_TS_AR_STEP = 103,
+
+// DISPIDs for IAnalogTVTuningSpace interface
+DISPID_TUNER_TS_ATV_MINCHANNEL = 101,
+DISPID_TUNER_TS_ATV_MAXCHANNEL = 102,
+DISPID_TUNER_TS_ATV_INPUTTYPE = 103,
+DISPID_TUNER_TS_ATV_COUNTRYCODE = 104,
+
+// DISPIDs for IATSCTuningSpace interface
+DISPID_TUNER_TS_ATSC_MINMINORCHANNEL = 201,
+DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL = 202,
+DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL = 203,
+DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL = 204,
+
+// DISPID for IAnalogTVAudioComponent interface
+DISPID_CHTUNER_ATVAC_CHANNEL = 101,
+
+// DISPIDs for IAnalogTVDataComponent interface
+DISPID_CHTUNER_ATVDC_SYSTEM = 101,
+DISPID_CHTUNER_ATVDC_CONTENT = 102,
+
+// DISPID for IChannelTuneRequest interface
+DISPID_CHTUNER_CTR_CHANNEL = 101,
+
+// DISPID IATSCChannelTuneRequest
+DISPID_CHTUNER_ACTR_MINOR_CHANNEL = 201,
+
+// DISPIDs for IDVBComponent interface
+DISPID_DVBTUNER_DVBC_ATTRIBUTESVALID = 101,
+DISPID_DVBTUNER_DVBC_PID = 102,
+DISPID_DVBTUNER_DVBC_TAG = 103,
+DISPID_DVBTUNER_DVBC_COMPONENTTYPE = 104,
+
+// DISPIDs for IDVBTuneRequest interface
+DISPID_DVBTUNER_ONID = 101,
+DISPID_DVBTUNER_TSID = 102,
+DISPID_DVBTUNER_SID = 103,
+
+// DISPIDs for IMPEG2TuneRequest interface
+DISPID_MP2TUNER_TSID = 101,
+DISPID_MP2TUNER_PROGNO = 102,
+
+// DISPIDs for IMPEG2TuneRequestFactory interface
+DISPID_MP2TUNERFACTORY_CREATETUNEREQUEST = 1,
+
+};
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Tuning Space Container
+//////////////////////////////////////////////////////////////////////////////////////
+// simple read-only collection of tuning spaces for enumerating subsets of the total
+// set of system tuning spaces
+ [
+ object,
+ uuid(901284E4-33FE-4b69-8D63-634A596F3756),
+ dual,
+ oleautomation,
+ nonextensible,
+ helpstring("Tuning Space Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface ITuningSpaces : IDispatch
+ {
+
+ [propget, helpstring("Number of items in the collection")]
+ HRESULT Count(
+ [out, retval] long *Count
+ );
+
+ [propget, id(DISPID_NEWENUM), hidden, restricted]
+ HRESULT _NewEnum(
+ [out, retval] IEnumVARIANT** NewEnum
+ );
+
+ [id(DISPID_VALUE),
+ propget,
+ helpstring("Find the Tuning Space with the specified Index")]
+ HRESULT Item(
+ [in] VARIANT varIndex,
+ [out, retval] ITuningSpace** TuningSpace
+ );
+
+ [propget, hidden, restricted,
+ helpstring("convenience function so C++ apps don't have to unpack VARIANT")]
+ HRESULT EnumTuningSpaces(
+ [out, retval] IEnumTuningSpaces** NewEnum
+ );
+
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Tuning Space Container
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ uuid(5B692E84-E2F1-11d2-9493-00C04F72D980),
+ dual,
+ oleautomation,
+ hidden,
+ nonextensible,
+ helpstring("Tuning Space Container Interface"),
+ pointer_default(unique)
+ ]
+ interface ITuningSpaceContainer : IDispatch
+ {
+
+ [propget, helpstring("Number of items in the collection")]
+ HRESULT Count(
+ [out, retval] long *Count
+ );
+
+ [propget, id(DISPID_NEWENUM), hidden, restricted]
+ HRESULT _NewEnum(
+ [out, retval] IEnumVARIANT** NewEnum
+ );
+
+ [id(DISPID_VALUE),
+ propget,
+ helpstring("Find the Tuning Space with the specified Index")]
+ HRESULT Item(
+ [in] VARIANT varIndex,
+ [out, retval] ITuningSpace** TuningSpace
+ );
+ [id(DISPID_VALUE),
+ propput,
+ helpstring("Change the Tuning Space with the specified Index")]
+ HRESULT Item([in] VARIANT varIndex, [in] ITuningSpace *TuningSpace);
+
+ [helpstring("Returns the collection of Tuning Spaces with the same implementation")]
+ HRESULT TuningSpacesForCLSID(
+ [in] BSTR SpaceCLSID,
+ [out, retval] ITuningSpaces** NewColl
+ );
+
+ [hidden, restricted,
+ helpstring("Convenience Function for enumerating from C")]
+ HRESULT _TuningSpacesForCLSID(
+ [in] REFCLSID SpaceCLSID,
+ [out, retval] ITuningSpaces** NewColl
+ );
+
+ [helpstring("Returns the collection of Tuning Spaces matching the name")]
+ HRESULT TuningSpacesForName(
+ [in] BSTR Name,
+ [out, retval] ITuningSpaces** NewColl
+ );
+
+ [helpstring("Find Local ID Number of the specified Tuning Space")]
+ HRESULT FindID(
+ [in] ITuningSpace *TuningSpace,
+ [out, retval] long *ID
+ );
+
+
+ [id(DISPID_ADDITEM),
+ helpstring("Add a new Tuning Space to the collection. This tuning space will be persisted unless removed")]
+ HRESULT Add(
+ [in] ITuningSpace* TuningSpace,
+ [out, retval] VARIANT* NewIndex
+ );
+
+ [propget, hidden, restricted, helpstring("Convenience Function for enumerating collection from C")]
+ HRESULT EnumTuningSpaces(
+ [out, retval] IEnumTuningSpaces **ppEnum
+ );
+
+ [id(DISPID_REMOVEITEM),
+ helpstring("Remove a Tuning Space from the collection. this tuning space will be deleted from the registry")]
+ HRESULT Remove(
+ [in] VARIANT Index
+ );
+
+ [propget, helpstring("Maximum number of items allowed in the collection")]
+ HRESULT MaxCount(
+ [out, retval] long *MaxCount
+ );
+
+ // we don't allow script to set this, but we do allow c code to change it.
+ [propput, hidden, restricted, helpstring("Maximum number of items allowed in the collection")]
+ HRESULT MaxCount(
+ [in] long MaxCount
+ );
+
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Tuning Space Interfaces
+//////////////////////////////////////////////////////////////////////////////////////
+
+// note: the network type is the clsid of the tuning space implementation
+ [
+ object,
+ uuid(061C6E30-E622-11d2-9493-00C04F72D980),
+ dual,
+ oleautomation,
+ nonextensible,
+ helpstring("Tuning Space Interface"),
+ pointer_default(unique)
+ ]
+ interface ITuningSpace : IDispatch
+ {
+ [propget, id(DISPID_TUNER_TS_UNIQUENAME),
+ helpstring("Unique name of the Tuning Space")]
+ HRESULT UniqueName(
+ [out, retval] BSTR *Name
+ );
+
+ [propput, id(DISPID_TUNER_TS_UNIQUENAME),
+ helpstring("Unique name of the Tuning Space")]
+ HRESULT UniqueName(
+ [in] BSTR Name
+ );
+
+ [propget, id(DISPID_TUNER_TS_FRIENDLYNAME),
+ helpstring("User-friendly name of the Tuning Space")]
+ HRESULT FriendlyName(
+ [out, retval] BSTR *Name
+ );
+
+ [propput, id(DISPID_TUNER_TS_FRIENDLYNAME),
+ helpstring("User-friendly name of the Tuning Space")]
+ HRESULT FriendlyName(
+ [in] BSTR Name
+ );
+
+ [propget, id(DISPID_TUNER_TS_CLSID),
+ helpstring("Returns the clsid of the tuning space implementation. provides script access to IPersist:GetClassID")]
+ HRESULT CLSID(
+ [out, retval] BSTR* SpaceCLSID
+ );
+
+ [propget, id(DISPID_TUNER_TS_NETWORKTYPE),
+ helpstring("Network Type (Network Proivder CLSID)")]
+ HRESULT NetworkType(
+ [out, retval] BSTR *NetworkTypeGuid
+ );
+ [propput, id(DISPID_TUNER_TS_NETWORKTYPE),
+ helpstring("Network Type (Network Proivder CLSID)")]
+ HRESULT NetworkType(
+ [in] BSTR NetworkTypeGuid
+ );
+
+ [propget, id(DISPID_TUNER_TS__NETWORKTYPE),
+ helpstring("Network Type (Network Proivder CLSID)"), hidden, restricted]
+ HRESULT _NetworkType(
+ [out, retval] GUID* NetworkTypeGuid
+ );
+ [propput, id(DISPID_TUNER_TS__NETWORKTYPE),
+ helpstring("Network Type (Network Proivder CLSID)"), hidden, restricted]
+ HRESULT _NetworkType(
+ [in] REFCLSID NetworkTypeGuid
+ );
+
+ // this method creates the "best" kind of tune request for this tuning space.
+ // the tuning space may support other kinds of tune requests created via
+ // other factory mechanisms(for example, see mpeg2tunerequestfactory). but,
+ // this method is the preferred way to get a tune request as it always returns
+ // the optimal type of tune request for this space.
+ [id(DISPID_TUNER_TS_CREATETUNEREQUEST),
+ helpstring("Create a Tune Request object")]
+ HRESULT CreateTuneRequest(
+ [out, retval] ITuneRequest **TuneRequest
+ );
+
+ [id(DISPID_TUNER_TS_ENUMCATEGORYGUIDS), hidden, restricted]
+ HRESULT EnumCategoryGUIDs(
+ [out, retval] IEnumGUID **ppEnum
+ );
+
+ [id(DISPID_TUNER_TS_ENUMDEVICEMONIKERS), hidden, restricted]
+ HRESULT EnumDeviceMonikers(
+ [out, retval] IEnumMoniker **ppEnum
+ );
+
+ [propget, id(DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES)]
+ HRESULT DefaultPreferredComponentTypes(
+ [out, retval] IComponentTypes** ComponentTypes
+ );
+ [propput, id(DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES)]
+ HRESULT DefaultPreferredComponentTypes(
+ [in] IComponentTypes* NewComponentTypes
+ );
+
+ // the following property is for the network providers to store frequency/channel maps, frequency/transponder maps
+ // or whatever other mapping from carrier frequencies to frequency identifiers are appropriate for the tuning space
+ // in question. the bstr is treated as a binary blob. it is expected to contain embedded nulls, and it may be formatted
+ // internally in whatever fashion the network provider sees fit.
+ [propget, id(DISPID_TUNER_TS_FREQMAP)]
+ HRESULT FrequencyMapping([out, retval] BSTR *pMapping);
+ [propput, id(DISPID_TUNER_TS_FREQMAP)]
+ HRESULT FrequencyMapping(BSTR Mapping);
+
+ // the following property provides a starting point for the initial IScanningTuner after installation
+ [propget, id(DISPID_TUNER_TS_DEFLOCATOR)]
+ HRESULT DefaultLocator([out, retval] ILocator **LocatorVal);
+ [propput, id(DISPID_TUNER_TS_DEFLOCATOR)]
+ HRESULT DefaultLocator([in]ILocator *LocatorVal);
+
+ HRESULT Clone([out, retval] ITuningSpace **NewTS);
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ hidden,
+ restricted,
+ object,
+ uuid(8B8EB248-FC2B-11d2-9D8C-00C04F72D980),
+ pointer_default(unique)
+ ]
+ interface IEnumTuningSpaces : IUnknown
+ {
+ HRESULT Next(
+ [in] ULONG celt,
+ [out, size_is(celt), length_is(*pceltFetched)]
+ ITuningSpace** rgelt,
+ [out] ULONG* pceltFetched
+ );
+
+ HRESULT Skip(
+ [in] ULONG celt
+ );
+
+ HRESULT Reset(void);
+
+ HRESULT Clone(
+ [out] IEnumTuningSpaces** ppEnum
+ );
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(ADA0B268-3B19-4e5b-ACC4-49F852BE13BA),
+ pointer_default(unique)
+ ]
+ interface IDVBTuningSpace : ITuningSpace
+ {
+ [propget, id(DISPID_TUNER_TS_DVB_SYSTEMTYPE),
+ helpstring("Type of DVB System")
+ ]
+ HRESULT SystemType(
+ [out, retval] DVBSystemType *SysType
+ );
+ [propput, id(DISPID_TUNER_TS_DVB_SYSTEMTYPE),
+ helpstring("Type of DVB System")
+ ]
+ HRESULT SystemType(
+ [in] DVBSystemType SysType
+ );
+
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(843188B4-CE62-43db-966B-8145A094E040),
+ pointer_default(unique)
+ ]
+ interface IDVBTuningSpace2 : IDVBTuningSpace
+ {
+ [propget, id(DISPID_TUNER_TS_DVB2_NETWORK_ID),
+ helpstring("Network ID of DVB System")
+ ]
+ HRESULT NetworkID(
+ [out, retval] long *NetworkID
+ );
+ [propput, id(DISPID_TUNER_TS_DVB2_NETWORK_ID),
+ helpstring("Network ID of DVB System")
+ ]
+ HRESULT NetworkID(
+ [in] long NetworkID
+ );
+
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(CDF7BE60-D954-42fd-A972-78971958E470),
+ pointer_default(unique)
+ ]
+ interface IDVBSTuningSpace : IDVBTuningSpace2
+ {
+
+ [propget, id(DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ),
+ helpstring("Low Oscillator Frequency of DVB System in KHZ units")
+ ]
+ HRESULT LowOscillator(
+ [out, retval] long *LowOscillator
+ );
+ [propput, id(DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ),
+ helpstring("Low Oscillator Frequency of DVB System in KHZ units")
+ ]
+ HRESULT LowOscillator(
+ [in] long LowOscillator
+ );
+ [propget, id(DISPID_TUNER_TS_DVBS_HI_OSC_FREQ),
+ helpstring("High Oscillator Frequency of DVB System in KHZ units")
+ ]
+ HRESULT HighOscillator(
+ [out, retval] long *HighOscillator
+ );
+ [propput, id(DISPID_TUNER_TS_DVBS_HI_OSC_FREQ),
+ helpstring("High Oscillator Frequency of DVB System in KHZ units")
+ ]
+ HRESULT HighOscillator(
+ [in] long HighOscillator
+ );
+ [propget, id(DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ),
+ helpstring("LNB Switch Frequency of DVB System in KHZ units")
+ ]
+ HRESULT LNBSwitch(
+ [out, retval] long *LNBSwitch
+ );
+ [propput, id(DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ),
+ helpstring("LNB Switch Frequency of DVB System in KHZ units")
+ ]
+ HRESULT LNBSwitch(
+ [in] long LNBSwitch
+ );
+ [propget, id(DISPID_TUNER_TS_DVBS_INPUT_RANGE),
+ helpstring("Which Option/Switch contains the requested signal source")
+ ]
+ HRESULT InputRange(
+ [out, retval] BSTR *InputRange
+ );
+ [propput, id(DISPID_TUNER_TS_DVBS_INPUT_RANGE),
+ helpstring("Which Option/Switch contains the requested signal source")
+ ]
+ HRESULT InputRange(
+ [in] BSTR InputRange
+ );
+ [propget, id(DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION),
+ helpstring("Which Option/Switch contains the requested signal source")
+ ]
+ HRESULT SpectralInversion(
+ [out, retval] SpectralInversion *SpectralInversionVal
+ );
+ [propput, id(DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION),
+ helpstring("Which Option/Switch contains the requested signal source")
+ ]
+ HRESULT SpectralInversion(
+ [in] SpectralInversion SpectralInversionVal
+ );
+
+
+ }
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(E48244B8-7E17-4f76-A763-5090FF1E2F30),
+ pointer_default(unique)
+ ]
+ interface IAuxInTuningSpace : ITuningSpace
+ {
+ }
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(2A6E293C-2595-11d3-B64C-00C04F79498E),
+ pointer_default(unique)
+ ]
+ interface IAnalogTVTuningSpace : ITuningSpace
+ {
+ [propget, id(DISPID_TUNER_TS_ATV_MINCHANNEL),
+ helpstring("Smallest channel number ever provided by this tuning space")
+ ]
+ HRESULT MinChannel(
+ [out, retval] long *MinChannelVal
+ );
+ [propput, id(DISPID_TUNER_TS_ATV_MINCHANNEL),
+ helpstring("Smallest channel number ever provided by this tuning space")
+ ]
+ HRESULT MinChannel(
+ [in] long NewMinChannelVal
+ );
+ [propget, id(DISPID_TUNER_TS_ATV_MAXCHANNEL),
+ helpstring("Largest channel number ever provided by this tuning space")
+ ]
+ HRESULT MaxChannel(
+ [out, retval] long *MaxChannelVal
+ );
+ [propput, id(DISPID_TUNER_TS_ATV_MAXCHANNEL),
+ helpstring("Largest channel number ever provided by this tuning space")
+ ]
+ HRESULT MaxChannel(
+ [in] long NewMaxChannelVal
+ );
+ [propget, id(DISPID_TUNER_TS_ATV_INPUTTYPE),
+ helpstring("Input type for this tuning space")
+ ]
+ HRESULT InputType([out, retval] TunerInputType *InputTypeVal);
+ [propput, id(DISPID_TUNER_TS_ATV_INPUTTYPE),
+ helpstring("Input type for this tuning space")
+ ]
+ HRESULT InputType([in] TunerInputType NewInputTypeVal);
+ [propget, id(DISPID_TUNER_TS_ATV_COUNTRYCODE),
+ helpstring("International dialing prefix for country of physical broadcast source")
+ ]
+ HRESULT CountryCode([out, retval] long *CountryCodeVal);
+ [propput, id(DISPID_TUNER_TS_ATV_COUNTRYCODE),
+ helpstring("International dialing prefix for country of physical broadcast source")
+ ]
+ HRESULT CountryCode([in] long NewCountryCodeVal);
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(0369B4E2-45B6-11d3-B650-00C04F79498E),
+ pointer_default(unique)
+ ]
+// note: we inherit ATSC from analog because we need the same properties.
+// - the definition of channel is overloaded to be the major channel,
+// - input type allows us to distinguish between broadcast and cable frequencies
+// which allows us to use the atsc tuning space class for "open cable".
+// - country code will allow us to redefine physical channel frequencies
+// if any other countries adopt ATSC which may happen in Latin America in particular.
+ interface IATSCTuningSpace : IAnalogTVTuningSpace
+ {
+ [propget, id(DISPID_TUNER_TS_ATSC_MINMINORCHANNEL),
+ helpstring("Smallest minor channel number ever provided by this tuning space")
+ ]
+ HRESULT MinMinorChannel(
+ [out, retval] long *MinMinorChannelVal
+ );
+ [propput, id(DISPID_TUNER_TS_ATSC_MINMINORCHANNEL),
+ helpstring("Smallest minor channel number ever provided by this tuning space")
+ ]
+ HRESULT MinMinorChannel(
+ [in] long NewMinMinorChannelVal
+ );
+ [propget, id(DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL),
+ helpstring("Largest minor channel number ever provided by this tuning space")
+ ]
+ HRESULT MaxMinorChannel(
+ [out, retval] long *MaxMinorChannelVal
+ );
+ [propput, id(DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL),
+ helpstring("Largest minor channel number ever provided by this tuning space")
+ ]
+ HRESULT MaxMinorChannel(
+ [in] long NewMaxMinorChannelVal
+ );
+ [propget, id(DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL),
+ helpstring("Smallest physical channel number ever provided by this tuning space")
+ ]
+ HRESULT MinPhysicalChannel(
+ [out, retval] long *MinPhysicalChannelVal
+ );
+ [propput, id(DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL),
+ helpstring("Smallest physical channel number ever provided by this tuning space")
+ ]
+ HRESULT MinPhysicalChannel(
+ [in] long NewMinPhysicalChannelVal
+ );
+ [propget, id(DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL),
+ helpstring("Largest physical channel number ever provided by this tuning space")
+ ]
+ HRESULT MaxPhysicalChannel(
+ [out, retval] long *MaxPhysicalChannelVal
+ );
+ [propput, id(DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL),
+ helpstring("Largest physical channel number ever provided by this tuning space")
+ ]
+ HRESULT MaxPhysicalChannel(
+ [in] long NewMaxPhysicalChannelVal
+ );
+
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ dual,
+ oleautomation,
+ nonextensible,
+ uuid(2A6E293B-2595-11d3-B64C-00C04F79498E),
+ pointer_default(unique)
+ ]
+ interface IAnalogRadioTuningSpace : ITuningSpace {
+ [propget, id(DISPID_TUNER_TS_AR_MINFREQUENCY),
+ helpstring("Smallest frequency(KHz) ever used by this tuning space")
+ ]
+ HRESULT MinFrequency(
+ [out, retval] long *MinFrequencyVal
+ );
+ [propput, id(DISPID_TUNER_TS_AR_MINFREQUENCY),
+ helpstring("Smallest frequency(KHz) ever used by this tuning space")
+ ]
+ HRESULT MinFrequency(
+ [in] long NewMinFrequencyVal
+ );
+ [propget, id(DISPID_TUNER_TS_AR_MAXFREQUENCY),
+ helpstring("Largest frequency(KHz) ever used by this tuning space")
+ ]
+ HRESULT MaxFrequency(
+ [out, retval] long *MaxFrequencyVal
+ );
+ [propput, id(DISPID_TUNER_TS_AR_MAXFREQUENCY),
+ helpstring("Largest frequency(KHz) ever used by this tuning space")
+ ]
+ HRESULT MaxFrequency(
+ [in] long NewMaxFrequencyVal
+ );
+ [propget, id(DISPID_TUNER_TS_AR_STEP),
+ helpstring("Default step value(KHz) to next frequency for this tuning space")
+ ]
+ HRESULT Step(
+ [out, retval] long *StepVal
+ );
+ [propput, id(DISPID_TUNER_TS_AR_STEP),
+ helpstring("Default step value(KHz) to next frequency for this tuning space")
+ ]
+ HRESULT Step(
+ [in] long NewStepVal
+ );
+ }
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Tune Request Interfaces
+//////////////////////////////////////////////////////////////////////////////////////
+// tune requests(of any kind) can only be obtained from tune request factories such as
+// ITuningSpace::CreateTuneRequest. one reason for this is that we always want to be
+// certain that a tune request is bound to the right tuning space. this means we don't
+// have to perform consistency checks all over the place.
+ [
+ object,
+ nonextensible,
+ uuid(07DDC146-FC3D-11d2-9D8C-00C04F72D980),
+ dual,
+ oleautomation,
+ helpstring("Tune Request Interface"),
+ pointer_default(unique)
+ ]
+ interface ITuneRequest : IDispatch
+ {
+ [propget, id(DISPID_TUNER_TR_TUNINGSPACE),
+ helpstring("Tuning Space object")]
+ HRESULT TuningSpace(
+ [out, retval] ITuningSpace **TuningSpace
+ );
+ [propget, id(DISPID_TUNER_TR_COMPONENTS),
+ helpstring("Components collection")]
+ HRESULT Components(
+ [out, retval] IComponents **Components
+ );
+ [id(DISPID_TUNER_TR_CLONE),
+ helpstring("Create a new copy of this tune request")]
+ HRESULT Clone(
+ [out, retval] ITuneRequest **NewTuneRequest
+ );
+ [propget, id(DISPID_TUNER_TR_LOCATOR),
+ helpstring("Locator Object")]
+ HRESULT Locator(
+ [out, retval] ILocator **Locator
+ );
+ [propput, id(DISPID_TUNER_TR_LOCATOR),
+ helpstring("Locator Object")]
+ HRESULT Locator(
+ [in] ILocator *Locator
+ );
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ nonextensible,
+ uuid(0369B4E0-45B6-11d3-B650-00C04F79498E),
+ dual,
+ oleautomation,
+ helpstring("Channel Tune Request Interface"),
+ pointer_default(unique)
+ ]
+ interface IChannelTuneRequest : ITuneRequest
+ {
+ [propget, id(DISPID_CHTUNER_CTR_CHANNEL),
+ helpstring("Channel")]
+ HRESULT Channel(
+ [out, retval] long *Channel
+ );
+ [propput, id(DISPID_CHTUNER_CTR_CHANNEL),
+ helpstring("Channel")]
+ HRESULT Channel(
+ [in] long Channel
+ );
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ nonextensible,
+ uuid(0369B4E1-45B6-11d3-B650-00C04F79498E),
+ dual,
+ oleautomation,
+ helpstring("ATSC Channel Tune Request Interface"),
+ pointer_default(unique)
+ ]
+ interface IATSCChannelTuneRequest : IChannelTuneRequest
+ {
+ [propget, id(DISPID_CHTUNER_ACTR_MINOR_CHANNEL),
+ helpstring("Minor Channel")]
+ HRESULT MinorChannel(
+ [out, retval] long *MinorChannel
+ );
+ [propput, id(DISPID_CHTUNER_ACTR_MINOR_CHANNEL),
+ helpstring("Minor Channel")]
+ HRESULT MinorChannel(
+ [in] long MinorChannel
+ );
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ nonextensible,
+ uuid(0D6F567E-A636-42bb-83BA-CE4C1704AFA2),
+ dual,
+ oleautomation,
+ helpstring("DVB Tune Request Interface"),
+ pointer_default(unique)
+ ]
+ interface IDVBTuneRequest : ITuneRequest
+ {
+ [propget, id(DISPID_DVBTUNER_ONID),
+ helpstring("Original Network ID")]
+ HRESULT ONID(
+ [out, retval] long *ONID
+ );
+ [propput, id(DISPID_DVBTUNER_ONID),
+ helpstring("Original Network ID")]
+ HRESULT ONID(
+ [in] long ONID
+ );
+ [propget, id(DISPID_DVBTUNER_TSID),
+ helpstring("Transport Stream ID")]
+ HRESULT TSID(
+ [out, retval] long *TSID
+ );
+ [propput, id(DISPID_DVBTUNER_TSID),
+ helpstring("Transport Stream ID")]
+ HRESULT TSID(
+ [in] long TSID
+ );
+ [propget, id(DISPID_DVBTUNER_SID),
+ helpstring("Service ID")]
+ HRESULT SID(
+ [out, retval] long *SID
+ );
+ [propput, id(DISPID_DVBTUNER_SID),
+ helpstring("Service ID")]
+ HRESULT SID(
+ [in] long SID
+ );
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+/// There are times(for example, reading from a file) when its useful to be able to tune
+/// a basic mpeg2 transport stream that contains minimal tables. this requires the least
+/// common denominator mpeg2 xport stream id information
+/// the following tune request supplies these properties. it can typiclly only be obtained from
+/// an mpeg2tunerequestfactory object. no known tune request(at this time) will return this
+/// from their createtunerequest() method. in other words, this is not the "best" tune request
+/// for any of the current tuning spaces.
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ nonextensible,
+ uuid(EB7D987F-8A01-42ad-B8AE-574DEEE44D1A),
+ dual,
+ oleautomation,
+ helpstring("MPEG2 Tune Request Interface"),
+ pointer_default(unique)
+ ]
+ interface IMPEG2TuneRequest : ITuneRequest
+ {
+ [propget, id(DISPID_MP2TUNER_TSID),
+ helpstring("Transport Stream ID")]
+ HRESULT TSID(
+ [out, retval] long *TSID
+ );
+ [propput, id(DISPID_MP2TUNER_TSID),
+ helpstring("Transport Stream ID")]
+ HRESULT TSID(
+ [in] long TSID
+ );
+ [propget, id(DISPID_MP2TUNER_PROGNO),
+ helpstring("Program Number ID")]
+ HRESULT ProgNo(
+ [out, retval] long *ProgNo
+ );
+ [propput, id(DISPID_MP2TUNER_PROGNO),
+ helpstring("Program Number ID")]
+ HRESULT ProgNo(
+ [in] long ProgNo
+ );
+ }
+
+ [
+ object,
+ nonextensible,
+ hidden,
+ uuid(14E11ABD-EE37-4893-9EA1-6964DE933E39),
+ dual,
+ oleautomation,
+ helpstring("MPEG2 Tune Request Factory Interface"),
+ pointer_default(unique)
+ ]
+ interface IMPEG2TuneRequestFactory : IDispatch
+ {
+ [id(DISPID_MP2TUNERFACTORY_CREATETUNEREQUEST),
+ helpstring("Create MPEG2 Tune Request for specified tuning space(if possible)")]
+ HRESULT CreateTuneRequest(
+ [in] ITuningSpace *TuningSpace,
+ [out, retval] IMPEG2TuneRequest **TuneRequest
+ );
+ }
+
+ [
+ object,
+ hidden,
+ restricted,
+ nonextensible,
+ uuid(1B9D5FC3-5BBC-4b6c-BB18-B9D10E3EEEBF),
+ helpstring("MPEG2 Tune Request Supported Interface"),
+ pointer_default(unique)
+ ]
+ interface IMPEG2TuneRequestSupport : IUnknown
+ {
+ }
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Tuner Interfaces
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(28C52640-018A-11d3-9D8E-00C04F72D980),
+ helpstring("Tuner Interface"),
+ pointer_default(unique)
+ ]
+ interface ITuner : IUnknown
+ {
+ [propget, helpstring("Tuning Space object")]
+ HRESULT TuningSpace(
+ [out, retval] ITuningSpace **TuningSpace
+ );
+
+ [propput, helpstring("Tuning Space object")]
+ HRESULT TuningSpace(
+ [in] ITuningSpace *TuningSpace
+ );
+
+ [hidden, restricted, helpstring("Returns an enumerator for Tuning Spaces accepted by this tuner")]
+ HRESULT EnumTuningSpaces(
+ [out, retval] IEnumTuningSpaces **ppEnum
+ );
+
+ [propget, helpstring("Tune Request object")]
+ HRESULT TuneRequest(
+ [out, retval] ITuneRequest **TuneRequest
+ );
+
+ [propput, helpstring("Tune Request object")]
+ HRESULT TuneRequest(
+ [in] ITuneRequest *TuneRequest
+ );
+
+ [helpstring("Validate the tuning request without tuning")]
+ HRESULT Validate(
+ [in] ITuneRequest *TuneRequest
+ );
+
+ [propget, helpstring("Preferred Component Types collection")]
+ HRESULT PreferredComponentTypes(
+ [out, retval] IComponentTypes **ComponentTypes
+ );
+
+ [propput, helpstring("Preferred Component Types collection")]
+ HRESULT PreferredComponentTypes(
+ [in] IComponentTypes *ComponentTypes
+ );
+
+ [propget, helpstring("Signal Strength")]
+ HRESULT SignalStrength(
+ [out, retval] long *Strength
+ );
+
+ [helpstring("Trigger Signal events (interval in milliseconds; 0 turns off trigger)")]
+ HRESULT TriggerSignalEvents(
+ [in] long Interval
+ );
+ }
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(1DFD0A5C-0284-11d3-9D8E-00C04F72D980),
+ helpstring("Scanning Tuner Interface"),
+ pointer_default(unique)
+ ]
+ interface IScanningTuner : ITuner
+ {
+ [helpstring("Seek to the next valid selection")]
+ HRESULT SeekUp(
+ );
+
+ [helpstring("Seek to the previous valid selection")]
+ HRESULT SeekDown(
+ );
+
+ [helpstring("Scan for valid selections upward")]
+ HRESULT ScanUp(
+ [in] long MillisecondsPause
+ );
+
+ [helpstring("Scan for valid selections downward")]
+ HRESULT ScanDown(
+ [in] long MillisecondsPause
+ );
+
+ [helpstring("Enter the device's autoprogram mode")]
+ HRESULT AutoProgram(
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Component Type Interfaces
+//////////////////////////////////////////////////////////////////////////////////////
+
+ // Component Category
+
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(6A340DC0-0311-11d3-9D8E-00C04F72D980),
+ dual,
+ oleautomation,
+ helpstring("Component Type Interface"),
+ pointer_default(unique)
+ ]
+ interface IComponentType : IDispatch
+ {
+ [propget, id(DISPID_TUNER_CT_CATEGORY),
+ helpstring("General category of component")]
+ HRESULT Category(
+ [out, retval] ComponentCategory *Category
+ );
+ [propput, id(DISPID_TUNER_CT_CATEGORY),
+ helpstring("General category of component")]
+ HRESULT Category(
+ [in] ComponentCategory Category
+ );
+
+ [propget, id(DISPID_TUNER_CT_MEDIAMAJORTYPE),
+ helpstring("DirectShow MediaType Major Type Guid")]
+ HRESULT MediaMajorType(
+ [out, retval] BSTR *MediaMajorType
+ );
+ [propput, id(DISPID_TUNER_CT_MEDIAMAJORTYPE),
+ helpstring("DirectShow MediaType Major Type Guid")]
+ HRESULT MediaMajorType(
+ [in] BSTR MediaMajorType
+ );
+ [propget, id(DISPID_TUNER_CT__MEDIAMAJORTYPE),
+ helpstring("DirectShow MediaType Major Type Guid"), hidden, restricted]
+ HRESULT _MediaMajorType(
+ [out, retval] GUID* MediaMajorTypeGuid
+ );
+ [propput, id(DISPID_TUNER_CT__MEDIAMAJORTYPE),
+ helpstring("DirectShow MediaType Major Type Guid"), hidden, restricted]
+ HRESULT _MediaMajorType(
+ [in] REFCLSID MediaMajorTypeGuid
+ );
+ [propget, id(DISPID_TUNER_CT_MEDIASUBTYPE),
+ helpstring("DirectShow MediaType Sub Type Guid")]
+ HRESULT MediaSubType(
+ [out, retval] BSTR *MediaSubType
+ );
+ [propput, id(DISPID_TUNER_CT_MEDIASUBTYPE),
+ helpstring("DirectShow MediaType Sub Type Guid")]
+ HRESULT MediaSubType(
+ [in] BSTR MediaSubType
+ );
+ [propget, id(DISPID_TUNER_CT__MEDIASUBTYPE),
+ helpstring("DirectShow MediaType Sub Type Guid"), hidden, restricted]
+ HRESULT _MediaSubType(
+ [out, retval] GUID* MediaSubTypeGuid
+ );
+ [propput, id(DISPID_TUNER_CT__MEDIASUBTYPE),
+ helpstring("DirectShow MediaType Sub Type Guid"), hidden, restricted]
+ HRESULT _MediaSubType(
+ [in] REFCLSID MediaSubTypeGuid
+ );
+ [propget, id(DISPID_TUNER_CT_MEDIAFORMATTYPE),
+ helpstring("DirectShow MediaType Format Guid")]
+ HRESULT MediaFormatType(
+ [out, retval] BSTR *MediaFormatType
+ );
+ [propput, id(DISPID_TUNER_CT_MEDIAFORMATTYPE),
+ helpstring("DirectShow MediaType Format Guid")]
+ HRESULT MediaFormatType(
+ [in] BSTR MediaFormatType
+ );
+ [propget, id(DISPID_TUNER_CT__MEDIAFORMATTYPE),
+ helpstring("DirectShow MediaType Format Guid"), hidden, restricted]
+ HRESULT _MediaFormatType(
+ [out, retval] GUID* MediaFormatTypeGuid
+ );
+ [propput, id(DISPID_TUNER_CT__MEDIAFORMATTYPE),
+ helpstring("DirectShow MediaType Format Guid"), hidden, restricted]
+ HRESULT _MediaFormatType(
+ [in] REFCLSID MediaFormatTypeGuid
+ );
+
+ [propget, id(DISPID_TUNER_CT_MEDIATYPE), hidden, restricted,
+ helpstring("DirectShow MediaType Guid, this only retrieves major, sub, format guids not the entire struct")]
+ HRESULT MediaType(
+ [out, retval] AM_MEDIA_TYPE *MediaType
+ );
+ [propput, id(DISPID_TUNER_CT_MEDIATYPE), hidden, restricted,
+ helpstring("DirectShow MediaType Guid, this only retrieves major, sub, format guids not the entire struct")]
+ HRESULT MediaType(
+ [in] AM_MEDIA_TYPE *MediaType
+ );
+
+ [id(DISPID_TUNER_CT_CLONE),
+ helpstring("Create a copy of this component type")]
+ HRESULT Clone(
+ [out, retval] IComponentType **NewCT
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(B874C8BA-0FA2-11d3-9D8E-00C04F72D980),
+ dual,
+ oleautomation,
+ helpstring("Language Component Type Interface"),
+ pointer_default(unique)
+ ]
+ interface ILanguageComponentType : IComponentType
+ {
+ [propget, id(DISPID_TUNER_LCT_LANGID),
+ helpstring("Language Identifier for Substream Content Language")]
+ HRESULT LangID(
+ [out, retval] long *LangID
+ );
+
+ [propput, id(DISPID_TUNER_LCT_LANGID),
+ helpstring("Language Identifier for Substream Content Language")]
+ HRESULT LangID(
+ [in] long LangID
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(2C073D84-B51C-48c9-AA9F-68971E1F6E38),
+ dual,
+ oleautomation,
+ helpstring("MPEG2 Component Type Interface"),
+ pointer_default(unique)
+ ]
+ interface IMPEG2ComponentType : ILanguageComponentType
+ {
+ [propget, id(DISPID_TUNER_MP2CT_TYPE),
+ helpstring("MPEG2 Stream Type")]
+ HRESULT StreamType(
+ [out, retval] MPEG2StreamType *MP2StreamType
+ );
+
+ [propput, id(DISPID_TUNER_MP2CT_TYPE),
+ helpstring("MPEG2 Stream Type")]
+ HRESULT StreamType(
+ [in] MPEG2StreamType MP2StreamType
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(FC189E4D-7BD4-4125-B3B3-3A76A332CC96),
+ dual,
+ oleautomation,
+ helpstring("ATSC Component Type Interface"),
+ pointer_default(unique)
+ ]
+ interface IATSCComponentType : IMPEG2ComponentType
+ {
+ [propget, id(DISPID_TUNER_ATSCCT_FLAGS),
+ helpstring("ATSC Component Type Flags")]
+ HRESULT Flags(
+ [out, retval] long *Flags
+ );
+
+ [propput, id(DISPID_TUNER_ATSCCT_FLAGS),
+ helpstring("ATSC Component Type Flags")]
+ HRESULT Flags(
+ [in] long flags
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ hidden, restricted,
+ object,
+ uuid(8A674B4A-1F63-11d3-B64C-00C04F79498E),
+ pointer_default(unique)
+ ]
+ interface IEnumComponentTypes : IUnknown
+ {
+ HRESULT Next(
+ [in] ULONG celt,
+ [out, size_is(celt), length_is(*pceltFetched)]
+ IComponentType** rgelt,
+ [out] ULONG* pceltFetched
+ );
+
+ HRESULT Skip(
+ [in] ULONG celt
+ );
+
+ HRESULT Reset(void);
+
+ HRESULT Clone(
+ [out] IEnumComponentTypes** ppEnum
+ );
+ }
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Component Type Container
+//////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(0DC13D4A-0313-11d3-9D8E-00C04F72D980),
+ dual,
+ oleautomation,
+ helpstring("ComponentType Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IComponentTypes : IDispatch
+ {
+ [propget, helpstring("Number of items in the collection")]
+ HRESULT Count(
+ [out, retval] long *Count
+ );
+
+ [propget, id(DISPID_NEWENUM), hidden, restricted]
+ HRESULT _NewEnum(
+ [out, retval] IEnumVARIANT **ppNewEnum
+ );
+
+ [hidden, restricted, helpstring("Convenience Function for Use with C")]
+ HRESULT EnumComponentTypes(
+ [out, retval] IEnumComponentTypes **ppNewEnum
+ );
+
+ [id(DISPID_VALUE),
+ propget,
+ helpstring("Get the ComponentType at the specified index")]
+ HRESULT Item(
+ [in] VARIANT Index,
+ [out, retval] IComponentType **ComponentType
+ );
+
+ [id(DISPID_VALUE),
+ propput,
+ helpstring("Get the ComponentType at the specified index")]
+ HRESULT Item(
+ [in] VARIANT Index,
+ [in] IComponentType *ComponentType
+ );
+
+ [id(DISPID_ADDITEM),
+ helpstring("Append the ComponentType to the collection")]
+ HRESULT Add(
+ [in] IComponentType *ComponentType,
+ [out, retval] VARIANT *NewIndex
+ );
+
+ [id(DISPID_REMOVEITEM),
+ helpstring("Clear the collection")]
+ HRESULT Remove(
+ [in] VARIANT Index
+ );
+
+ [helpstring("Copy the collection")]
+ HRESULT Clone([out, retval] IComponentTypes **NewList);
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Component Interfaces
+//////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ object,
+ nonextensible,
+ uuid(1A5576FC-0E19-11d3-9D8E-00C04F72D980),
+ dual,
+ oleautomation,
+ helpstring("Component Interface"),
+ pointer_default(unique)
+ ]
+ interface IComponent : IDispatch
+ {
+ [propget, id(DISPID_TUNER_C_TYPE),
+ helpstring("Component Type")]
+ HRESULT Type(
+ [out, retval] IComponentType** CT
+ );
+
+ // only loaders initialize components
+ [hidden, restricted, propput, id(DISPID_TUNER_C_TYPE),
+ helpstring("Component Type")]
+ HRESULT Type(
+ [in] IComponentType* CT
+ );
+
+ // NOTE: this langid is *not* the same as the langid
+ // in the componenttype(if the componenttype is a languagecomponenttype)
+ // the langid in the component type is the language of the content this
+ // component is describing. the following langid in the component is the
+ // language of the descriptive info in the component object.
+ [propget, id(DISPID_TUNER_C_LANGID),
+ helpstring("Language Identifier for Description Language")]
+ HRESULT DescLangID(
+ [out, retval] long *LangID
+ );
+
+ [propput, id(DISPID_TUNER_C_LANGID),
+ helpstring("Language Identifier for Description Language")]
+ HRESULT DescLangID(
+ [in] long LangID
+ );
+
+ [propget, id(DISPID_TUNER_C_STATUS),
+ helpstring("Component Status")]
+ HRESULT Status(
+ [out, retval] ComponentStatus *Status
+ );
+
+ [propput, id(DISPID_TUNER_C_STATUS),
+ helpstring("Component Status")]
+ HRESULT Status(
+ [in] ComponentStatus Status
+ );
+
+ [propget, id(DISPID_TUNER_C_DESCRIPTION),
+ helpstring("Component Description")]
+ HRESULT Description(
+ [out, retval] BSTR *Description
+ );
+
+ // restricted: only loaders will initialize components
+ [hidden, restricted, propput, id(DISPID_TUNER_C_DESCRIPTION),
+ helpstring("Component Description")]
+ HRESULT Description(
+ [in] BSTR Description
+ );
+
+ [id(DISPID_TUNER_C_CLONE),
+ helpstring("Copy Component")]
+ HRESULT Clone(
+ [out, retval] IComponent **NewComponent
+ );
+
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ nonextensible,
+ uuid(1493E353-1EB6-473c-802D-8E6B8EC9D2A9),
+ dual,
+ oleautomation,
+ helpstring("MPEG2 Component Interface"),
+ pointer_default(unique)
+ ]
+ interface IMPEG2Component : IComponent
+ {
+ [propget, id(DISPID_TUNER_C_MP2_PID),
+ helpstring("MPEG2 Packet ID for this Substream")]
+ HRESULT PID(
+ [out, retval] long *PID
+ );
+
+ [propput, id(DISPID_TUNER_C_MP2_PID),
+ helpstring("MPEG2 Packet ID for this Substream")]
+ HRESULT PID(
+ [in] long PID
+ );
+ [propget, id(DISPID_TUNER_C_MP2_PCRPID),
+ helpstring("MPEG2 Packet ID for this Substream's Timestamps")]
+ HRESULT PCRPID(
+ [out, retval] long *PCRPID
+ );
+
+ [propput, id(DISPID_TUNER_C_MP2_PCRPID),
+ helpstring("MPEG2 Packet ID for this Substream's Timestamps")]
+ HRESULT PCRPID(
+ [in] long PCRPID
+ );
+
+ // program number provides reverse lookup to PAT
+ [propget, id(DISPID_TUNER_C_MP2_PROGNO),
+ helpstring("MPEG2 Program Number")]
+ HRESULT ProgramNumber(
+ [out, retval] long *ProgramNumber
+ );
+
+ [propput, id(DISPID_TUNER_C_MP2_PROGNO),
+ helpstring("MPEG2 Program Number")]
+ HRESULT ProgramNumber(
+ [in] long ProgramNumber
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ hidden, restricted,
+ object,
+ uuid(2A6E2939-2595-11d3-B64C-00C04F79498E),
+ pointer_default(unique)
+ ]
+ interface IEnumComponents : IUnknown
+ {
+ HRESULT Next(
+ [in] ULONG celt,
+ [out, size_is(celt), length_is(*pceltFetched)]
+ IComponent** rgelt,
+ [out] ULONG* pceltFetched
+ );
+
+ HRESULT Skip(
+ [in] ULONG celt
+ );
+
+ HRESULT Reset(void);
+
+ HRESULT Clone(
+ [out] IEnumComponents** ppEnum
+ );
+ }
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Component Container
+//////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ object,
+ nonextensible,
+ uuid(FCD01846-0E19-11d3-9D8E-00C04F72D980),
+ dual,
+ oleautomation,
+ helpstring("Component Collection Interface"),
+ pointer_default(unique)
+ ]
+ interface IComponents : IDispatch
+ {
+ [propget, helpstring("Number of items in the collection")]
+ HRESULT Count(
+ [out, retval] long *Count
+ );
+
+ [propget, id(DISPID_NEWENUM), hidden, restricted]
+ HRESULT _NewEnum(
+ [out, retval] IEnumVARIANT **ppNewEnum
+ );
+
+ [hidden, restricted, helpstring("Convenience Function for Use with C")]
+ HRESULT EnumComponents(
+ [out, retval] IEnumComponents **ppNewEnum
+ );
+
+ [id(DISPID_VALUE),
+ propget,
+ helpstring("Get the Component at the specified index")]
+ HRESULT Item(
+ [in] VARIANT Index,
+ [out, retval] IComponent **ppComponent
+ );
+
+ [id(DISPID_ADDITEM),
+ helpstring("Add the Component to the collection")]
+ HRESULT Add(
+ [in] IComponent *Component,
+ [out, retval] VARIANT *NewIndex
+ );
+
+ [id(DISPID_REMOVEITEM),
+ helpstring("Remove the Component at the specified index")]
+ HRESULT Remove(
+ [in] VARIANT Index
+ );
+
+ [helpstring("Copy the collection")]
+ HRESULT Clone([out, retval] IComponents **NewList);
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Component Container
+//////////////////////////////////////////////////////////////////////////////////////
+// this separates the what(general tune request properties) from the where
+
+
+
+ [
+ object,
+ nonextensible,
+ uuid(286D7F89-760C-4F89-80C4-66841D2507AA),
+ dual,
+ oleautomation,
+ helpstring("Generic Locator Information"),
+ pointer_default(unique)
+ ]
+ interface ILocator : IDispatch
+ {
+
+ [propget, id(DISPID_TUNER_L_CARRFREQ), helpstring("Carrier Frequency(KHz)")]
+ HRESULT CarrierFrequency(
+ [out, retval] long* Frequency
+ );
+ [propput, id(DISPID_TUNER_L_CARRFREQ), helpstring("Carrier Frequency(KHz)")]
+ HRESULT CarrierFrequency(
+ [in] long Frequency
+ );
+ [propget, id(DISPID_TUNER_L_INNERFECMETHOD), helpstring("Inner Fec Type")]
+ HRESULT InnerFEC(
+ [out, retval] FECMethod* FEC
+ );
+ [propput, id(DISPID_TUNER_L_INNERFECMETHOD), helpstring("Inner Fec Type")]
+ HRESULT InnerFEC(
+ [in] FECMethod FEC
+ );
+ [propget, id(DISPID_TUNER_L_INNERFECRATE), helpstring("Inner Fec Rate")]
+ HRESULT InnerFECRate(
+ [out, retval] BinaryConvolutionCodeRate* FEC
+ );
+ [propput, id(DISPID_TUNER_L_INNERFECRATE), helpstring("Inner Fec Rate")]
+ HRESULT InnerFECRate(
+ [in] BinaryConvolutionCodeRate FEC
+ );
+ [propget, id(DISPID_TUNER_L_OUTERFECMETHOD), helpstring("Outer Fec Type")]
+ HRESULT OuterFEC(
+ [out, retval] FECMethod* FEC
+ );
+ [propput, id(DISPID_TUNER_L_OUTERFECMETHOD), helpstring("Outer Fec Type")]
+ HRESULT OuterFEC(
+ [in] FECMethod FEC
+ );
+ [propget, id(DISPID_TUNER_L_OUTERFECRATE), helpstring("Outer Fec Rate")]
+ HRESULT OuterFECRate(
+ [out, retval] BinaryConvolutionCodeRate* FEC
+ );
+ [propput, id(DISPID_TUNER_L_OUTERFECRATE), helpstring("Outer Fec Rate")]
+ HRESULT OuterFECRate(
+ [in] BinaryConvolutionCodeRate FEC
+ );
+ [propget, id(DISPID_TUNER_L_MOD), helpstring("Modulation Type")]
+ HRESULT Modulation(
+ [out, retval] ModulationType* Modulation
+ );
+ [propput, id(DISPID_TUNER_L_MOD), helpstring("Modulation Type")]
+ HRESULT Modulation(
+ [in] ModulationType Modulation
+ );
+ [propget, id(DISPID_TUNER_L_SYMRATE), helpstring("Modulation Symbol Rate")]
+ HRESULT SymbolRate(
+ [out, retval] long* Rate
+ );
+ [propput, id(DISPID_TUNER_L_SYMRATE), helpstring("Modulation Symbol Rate")]
+ HRESULT SymbolRate(
+ [in] long Rate
+ );
+ [id(DISPID_TUNER_L_CLONE), helpstring("Copy the Locator")]
+ HRESULT Clone([out, retval] ILocator **NewLocator);
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF),
+ dual,
+ oleautomation,
+ helpstring("ATSC Locator Information"),
+ pointer_default(unique)
+ ]
+ interface IATSCLocator : ILocator
+ {
+ [propget, id(DISPID_TUNER_L_ATSC_PHYS_CHANNEL),
+ helpstring("Physical Channel")]
+ HRESULT PhysicalChannel(
+ [out, retval] long *PhysicalChannel
+ );
+ [propput, id(DISPID_TUNER_L_ATSC_PHYS_CHANNEL),
+ helpstring("Physical Channel")]
+ HRESULT PhysicalChannel(
+ [in] long PhysicalChannel
+ );
+ [propget, id(DISPID_TUNER_L_ATSC_TSID),
+ helpstring("Transport Stream ID")]
+ HRESULT TSID(
+ [out, retval] long *TSID
+ );
+ [propput, id(DISPID_TUNER_L_ATSC_TSID),
+ helpstring("Transport Stream ID")]
+ HRESULT TSID(
+ [in] long TSID
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(8664DA16-DDA2-42ac-926A-C18F9127C302),
+ dual,
+ oleautomation,
+ helpstring("DVB Terrestrial Locator Information"),
+ pointer_default(unique)
+ ]
+ interface IDVBTLocator : ILocator
+ {
+ [propget, id(DISPID_TUNER_L_DVBT_BANDWIDTH), helpstring("Bandwidth")]
+ HRESULT Bandwidth(
+ [out, retval] long* BandWidthVal
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_BANDWIDTH), helpstring("Bandwidth")]
+ HRESULT Bandwidth(
+ [in] long BandwidthVal
+ );
+
+ [propget, id(DISPID_TUNER_L_DVBT_LPINNERFECMETHOD), helpstring("Inner Fec Type for Low Priority Stream")]
+ HRESULT LPInnerFEC(
+ [out, retval] FECMethod* FEC
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_LPINNERFECMETHOD), helpstring("Inner Fec Type for Low Priority Stream")]
+ HRESULT LPInnerFEC(
+ [in] FECMethod FEC
+ );
+ [propget, id(DISPID_TUNER_L_DVBT_LPINNERFECRATE), helpstring("Inner Fec Rate for Low Priority Stream")]
+ HRESULT LPInnerFECRate(
+ [out, retval] BinaryConvolutionCodeRate* FEC
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_LPINNERFECRATE), helpstring("Inner Fec Rate for Low Priority Stream")]
+ HRESULT LPInnerFECRate(
+ [in] BinaryConvolutionCodeRate FEC
+ );
+ [propget, id(DISPID_TUNER_L_DVBT_HALPHA), helpstring("Hierarchical Alpha")]
+ HRESULT HAlpha(
+ [out, retval] HierarchyAlpha* Alpha
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_HALPHA), helpstring("Hierarchical Alpha")]
+ HRESULT HAlpha(
+ [in] HierarchyAlpha Alpha
+ );
+ [propget, id(DISPID_TUNER_L_DVBT_GUARDINTERVAL), helpstring("Guard Interval")]
+ HRESULT Guard(
+ [out, retval] GuardInterval* GI
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_GUARDINTERVAL), helpstring("Guard Interval")]
+ HRESULT Guard(
+ [in] GuardInterval GI
+ );
+ [propget, id(DISPID_TUNER_L_DVBT_TRANSMISSIONMODE), helpstring("Transmission Mode")]
+ HRESULT Mode(
+ [out, retval] TransmissionMode* mode
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_TRANSMISSIONMODE), helpstring("Transmission Mode")]
+ HRESULT Mode(
+ [in] TransmissionMode mode
+ );
+ [propget, id(DISPID_TUNER_L_DVBT_INUSE), helpstring("Hierarchical Alpha")]
+ HRESULT OtherFrequencyInUse(
+ [out, retval] VARIANT_BOOL* OtherFrequencyInUseVal
+ );
+ [propput, id(DISPID_TUNER_L_DVBT_INUSE), helpstring("Hierarchical Alpha")]
+ HRESULT OtherFrequencyInUse(
+ [in] VARIANT_BOOL OtherFrequencyInUseVal
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(3D7C353C-0D04-45f1-A742-F97CC1188DC8),
+ dual,
+ oleautomation,
+ helpstring("DVB Satellite Locator Information"),
+ pointer_default(unique)
+ ]
+ interface IDVBSLocator : ILocator
+ {
+
+ [propget, id(DISPID_TUNER_L_DVBS_POLARISATION), helpstring("Signal Polarisation Type")]
+ HRESULT SignalPolarisation(
+ [out, retval] Polarisation* PolarisationVal
+ );
+ [propput, id(DISPID_TUNER_L_DVBS_POLARISATION), helpstring("Signal Polarisation Type")]
+ HRESULT SignalPolarisation(
+ [in] Polarisation PolarisationVal
+ );
+ [propget, id(DISPID_TUNER_L_DVBS_WEST), helpstring("VARIANT_TRUE means orbital position specifies west longitude")]
+ HRESULT WestPosition(
+ [out, retval] VARIANT_BOOL* WestLongitude
+ );
+ [propput, id(DISPID_TUNER_L_DVBS_WEST), helpstring("VARIANT_TRUE means orbital position specifies west longitude")]
+ HRESULT WestPosition(
+ [in] VARIANT_BOOL WestLongitude
+ );
+ [propget, id(DISPID_TUNER_L_DVBS_ORBITAL), helpstring("Longitude in tenths of a degree")]
+ HRESULT OrbitalPosition(
+ [out, retval] long* longitude
+ );
+ [propput, id(DISPID_TUNER_L_DVBS_ORBITAL), helpstring("Longitude in tenths of a degree")]
+ HRESULT OrbitalPosition(
+ [in] long longitude
+ );
+ [propget, id(DISPID_TUNER_L_DVBS_AZIMUTH), helpstring("Azimuth in tenths of a degree")]
+ HRESULT Azimuth(
+ [out, retval] long* Azimuth
+ );
+ [propput, id(DISPID_TUNER_L_DVBS_AZIMUTH), helpstring("Azimuth in tenths of a degree")]
+ HRESULT Azimuth(
+ [in] long Azimuth
+ );
+ [propget, id(DISPID_TUNER_L_DVBS_ELEVATION), helpstring("Elevation in tenths of a degree")]
+ HRESULT Elevation(
+ [out, retval] long* Elevation
+ );
+ [propput, id(DISPID_TUNER_L_DVBS_ELEVATION), helpstring("Elevation in tenths of a degree")]
+ HRESULT Elevation(
+ [in] long Elevation
+ );
+ };
+
+//////////////////////////////////////////////////////////////////////////////////////
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(6E42F36E-1DD2-43c4-9F78-69D25AE39034),
+ dual,
+ oleautomation,
+ helpstring("DVB Cable Locator Information"),
+ pointer_default(unique)
+ ]
+ interface IDVBCLocator : ILocator
+ {
+ };
+
+///////////////////////////////////////////////////////////////////////////////////////
+// utility interfaces
+///////////////////////////////////////////////////////////////////////////////////////
+
+ [
+ object,
+ hidden,
+ nonextensible,
+ uuid(3B21263F-26E8-489d-AAC4-924F7EFD9511),
+ helpstring("Broadcast Event Service Firing/Reflecting Interface"),
+ pointer_default(unique)
+ ]
+ interface IBroadcastEvent : IUnknown
+ {
+ HRESULT Fire(GUID EventID);
+ };
+
+
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+// TYPELIB & CoClasses
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+[
+ uuid(9B085638-018E-11d3-9D8E-00C04F72D980),
+ version(1.0),
+ helpstring("Microsoft Tuner 1.0 Type Library")
+]
+library TunerLib
+{
+ importlib("stdole2.tlb");
+
+ // SystemTuningSpaces class
+ [
+ uuid(D02AAC50-027E-11d3-9D8E-00C04F72D980),
+ helpstring("SystemTuningSpace Class")
+ ]
+ coclass SystemTuningSpaces
+ {
+ [default] interface ITuningSpaceContainer;
+ };
+
+ // NOTE: there is no object factory for this class. the implementation for the underlying
+ // code is a c++ abstract base class. this coclass is only provided here to
+ // force vb to expose the base interface to enable polymorphic access to
+ // derived objects
+ [
+ hidden, restricted,
+ uuid(5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB),
+ helpstring("dummy class to expose base tuning space i/f to VB")
+ ]
+ coclass TuningSpace
+ {
+ [default] interface ITuningSpace;
+ };
+
+
+ [
+ uuid(A2E30750-6C3D-11d3-B653-00C04F79498E),
+ helpstring("ATSC Digital Broadcast Tuning Space Class")
+ ]
+ coclass ATSCTuningSpace
+ {
+ [default] interface IATSCTuningSpace;
+ };
+
+ [
+ uuid(8A674B4C-1F63-11d3-B64C-00C04F79498E),
+ helpstring("Analog Radio Tuning Space Class")
+ ]
+ coclass AnalogRadioTuningSpace
+ {
+ [default] interface IAnalogRadioTuningSpace;
+ };
+
+ [
+ uuid(F9769A06-7ACA-4e39-9CFB-97BB35F0E77E),
+ helpstring("Auxiliary Inputs Tuning Space Class")
+ ]
+ coclass AuxInTuningSpace
+ {
+ [default] interface IAuxInTuningSpace;
+ };
+
+ [
+ uuid(8A674B4D-1F63-11d3-B64C-00C04F79498E),
+ helpstring("Analog TV Tuning Space Class")
+ ]
+ coclass AnalogTVTuningSpace
+ {
+ [default] interface IAnalogTVTuningSpace;
+ };
+
+ [
+ uuid(C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7),
+ helpstring("DVB Tuning Space Class")
+ ]
+ coclass DVBTuningSpace
+ {
+ [default] interface IDVBTuningSpace2;
+ interface IDVBTuningSpace;
+ };
+
+ [
+ uuid(B64016F3-C9A2-4066-96F0-BD9563314726),
+ helpstring("DVB Satellite Tuning Space Class")
+ ]
+ coclass DVBSTuningSpace
+ {
+ [default] interface IDVBSTuningSpace;
+ };
+
+
+ // ComponentTypes container class
+ [
+ uuid(A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980),
+ helpstring("Component Types Collection Class")
+ ]
+ coclass ComponentTypes
+ {
+ [default] interface IComponentTypes;
+ };
+
+ // ComponentType class
+ [
+ uuid(823535A0-0318-11d3-9D8E-00C04F72D980),
+ helpstring("ComponentType Class")
+ ]
+ coclass ComponentType
+ {
+ [default] interface IComponentType;
+ };
+
+ // Language ComponentType class
+ [
+ uuid(1BE49F30-0E1B-11d3-9D8E-00C04F72D980),
+ helpstring("LanguageComponentType Class")
+ ]
+ coclass LanguageComponentType
+ {
+ [default] interface ILanguageComponentType;
+ };
+
+ // MPEG2 ComponentType class
+ [
+ uuid(418008F3-CF67-4668-9628-10DC52BE1D08),
+ helpstring("MPEG2ComponentType Class")
+ ]
+ coclass MPEG2ComponentType
+ {
+ [default] interface IMPEG2ComponentType;
+ };
+
+ // ATSC ComponentType class
+ [
+ uuid(A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE),
+ helpstring("ATSCComponentType Class")
+ ]
+ coclass ATSCComponentType
+ {
+ [default] interface IATSCComponentType;
+ };
+
+ // Components class
+ [
+ hidden, restricted,
+ uuid(809B6661-94C4-49e6-B6EC-3F0F862215AA),
+ helpstring("Components Collection Class")
+ ]
+ coclass Components
+ {
+ [default] interface IComponents;
+ };
+
+ // Component class
+ // the components can only be created by network provider/tif. client apps
+ // retrieve them from a filled-in tune request by either loading a persisted tune
+ // request that has been filled in by a proper guide store loader or by re-getting
+ // the current tune request property which will have this filled in by the network
+ // provider
+ [
+ hidden, restricted,
+ uuid(59DC47A8-116C-11d3-9D8E-00C04F72D980),
+ helpstring("Component Class")
+ ]
+ coclass Component
+ {
+ [default] interface IComponent;
+ };
+
+ // MPEG2 Component class
+ [
+ hidden, restricted,
+ uuid(055CB2D7-2969-45cd-914B-76890722F112),
+ helpstring("MPEG2 Component Class")
+ ]
+ coclass MPEG2Component
+ {
+ [default] interface IMPEG2Component;
+ };
+
+
+ // NOTE: there is no object factory for this class. the implementation for the underlying
+ // code is a c++ abstract base class. this coclass is only provided here to
+ // force vb to expose the base interface to enable polymorphic access to
+ // derived objects
+ [
+ hidden, restricted,
+ uuid(B46E0D38-AB35-4a06-A137-70576B01B39F),
+ helpstring("dummy class to expose base tune request i/f to VB")
+ ]
+ coclass TuneRequest
+ {
+ [default] interface ITuneRequest;
+ };
+
+
+ // NOTE: the tuning request factories should not be invoked directly.
+ // instead apps should use ITuningSpace::CreateTuningRequest to obtain a correctly
+ // initialized tuning request of the appropriate type for that space.
+ // the object factories are provided to allow generic code to a load a previously persisted
+ // tune request object.
+ [
+ hidden,
+ restricted,
+ uuid(0369B4E5-45B6-11d3-B650-00C04F79498E),
+ helpstring("Channel Tune Request")
+ ]
+ coclass ChannelTuneRequest
+ {
+ [default] interface IChannelTuneRequest;
+ };
+
+ [
+ hidden,
+ restricted,
+ uuid(0369B4E6-45B6-11d3-B650-00C04F79498E),
+ helpstring("ATSC Channel Tune Request")
+ ]
+ coclass ATSCChannelTuneRequest
+ {
+ [default] interface IATSCChannelTuneRequest;
+ };
+
+ // NOTE: there is no object factory for this class. the implementation for the underlying
+ // code is a c++ abstract base class. this coclass is only provided here to
+ // force vb to expose the base interface to enable polymorphic access to
+ // derived objects
+ [
+ hidden, restricted,
+ uuid(0955AC62-BF2E-4cba-A2B9-A63F772D46CF),
+ helpstring("dummy class to expose mpeg2 request i/f to VB")
+ ]
+ coclass MPEG2TuneRequest
+ {
+ [default] interface IMPEG2TuneRequest;
+ };
+
+ [
+ uuid(2C63E4EB-4CEA-41b8-919C-E947EA19A77C),
+ helpstring("Factory for creating IMPEG2TuneRequest")
+ ]
+ coclass MPEG2TuneRequestFactory
+ {
+ [default] interface IMPEG2TuneRequestFactory;
+ };
+
+
+ // NOTE: there is no object factory for this class. the implementation for the underlying
+ // code is a c++ abstract base class. this coclass is only provided here to
+ // force vb to expose the base interface to enable polymorphic access to
+ // derived objects
+ [
+ hidden, restricted,
+ uuid(0888C883-AC4F-4943-B516-2C38D9B34562),
+ helpstring("dummy class to expose base locator i/f to VB")
+ ]
+ coclass Locator
+ {
+ [default] interface ILocator;
+ };
+
+ // its not intended that client apps actually create locators. the network
+ // provider in combination with the transport information filter(TIF) are the
+ // only modules in the system that actually know the correct values for these objects
+ // however, for testing purposes, its necessary to allow these to be created.
+ // instead, normally these will simply be passed around opaquely since they're a
+ // property of the base tune request interface.
+ [
+ uuid(8872FF1B-98FA-4d7a-8D93-C9F1055F85BB),
+ helpstring("ATSC Locator")
+ ]
+ coclass ATSCLocator
+ {
+ [default] interface IATSCLocator;
+ };
+
+ [
+ uuid(9CD64701-BDF3-4d14-8E03-F12983D86664),
+ helpstring("DVB-Terrestrial Locator")
+ ]
+ coclass DVBTLocator
+ {
+ [default] interface IDVBTLocator;
+ };
+
+ [
+ uuid(1DF7D126-4050-47f0-A7CF-4C4CA9241333),
+ helpstring("DVB-Satellite Locator")
+ ]
+ coclass DVBSLocator
+ {
+ [default] interface IDVBSLocator;
+ };
+
+ [
+ uuid(C531D9FD-9685-4028-8B68-6E1232079F1E),
+ helpstring("DVB-Cable Locator")
+ ]
+ coclass DVBCLocator
+ {
+ [default] interface IDVBCLocator;
+ };
+
+ [
+ hidden,
+ restricted,
+ uuid(15D6504A-5494-499c-886C-973C9E53B9F1),
+ helpstring("DVB Tune Request")
+ ]
+ coclass DVBTuneRequest
+ {
+ [default] interface IDVBTuneRequest;
+ };
+
+// Sample tuner class definition:
+//
+// [
+// uuid(<some guid>),
+// helpstring("My Tuner object")
+// ]
+// coclass MyTuner
+// {
+// [default] interface ITuner;
+// interface IMyTunerCustomFeatureInterface;
+// };
+
+///////////////////////////////////////////////////////////////////////////////////////
+// utility objects
+///////////////////////////////////////////////////////////////////////////////////////
+ [
+ hidden, restricted,
+ uuid(8A674B49-1F63-11d3-B64C-00C04F79498E),
+ helpstring("Create property bag backed by registry")
+ ]
+ coclass CreatePropBagOnRegKey
+ {
+ interface ICreatePropBagOnRegKey;
+ };
+
+ [
+ hidden, restricted,
+ uuid(0B3FFB92-0919-4934-9D5B-619C719D0202),
+ helpstring("DShow Broadcast Event Service Object")
+ ]
+ coclass BroadcastEventService
+ {
+ interface IBroadcastEvent;
+ };
+
+cpp_quote("#define SID_SBroadcastEventService CLSID_BroadcastEventService")
+
+}
+
+// end of file -- tuner.idl
diff --git a/dxsdk/Include/DShowIDL/tvratings.idl b/dxsdk/Include/DShowIDL/tvratings.idl
new file mode 100644
index 00000000..5bf80214
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/tvratings.idl
@@ -0,0 +1,242 @@
+// TvRatings.idl : IDL source for TvRatings.dll
+//
+
+// This file will be processed by the MIDL tool to
+// produce the type library (TvRatings.tlb) and marshalling code.
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+typedef enum
+{
+ MPAA = 0,
+ US_TV = 1,
+ Canadian_English = 2,
+ Canadian_French = 3,
+ Reserved4 = 4, // filler - not used.
+ System5 = 5, // maps to system 5 of XDS rating table 19
+ System6 = 6, // maps to system 6 of XDS rating table 19
+ Reserved7 = 7, // filler - not used.
+ TvRat_kSystems = 8, // used for allocating structures
+ TvRat_SystemDontKnow = 255 // haven't gotten a data value yet... (perhaps change to 0)
+} EnTvRat_System;
+
+
+typedef enum // constraint is that must be in increasing order, and max < 2^8
+{
+ TvRat_0 = 0,
+ TvRat_1 = 1,
+ TvRat_2 = 2,
+ TvRat_3 = 3,
+ TvRat_4 = 4,
+ TvRat_5 = 5,
+ TvRat_6 = 6,
+ TvRat_7 = 7,
+ TvRat_kLevels = 8, // used for allocating structures
+ TvRat_LevelDontKnow = 255 // haven't gotten a data value yet... (perhaps change to _7)
+} EnTvRat_GenericLevel;
+
+
+typedef enum
+{
+ MPAA_NotApplicable = TvRat_0,
+ MPAA_G = TvRat_1,
+ MPAA_PG = TvRat_2,
+ MPAA_PG13 = TvRat_3,
+ MPAA_R = TvRat_4,
+ MPAA_NC17 = TvRat_5,
+ MPAA_X = TvRat_6,
+ MPAA_NotRated = TvRat_7
+} EnTvRat_MPAA;
+
+typedef enum
+{
+ US_TV_None = TvRat_0,
+ US_TV_Y = TvRat_1,
+ US_TV_Y7 = TvRat_2,
+ US_TV_G = TvRat_3,
+ US_TV_PG = TvRat_4,
+ US_TV_14 = TvRat_5,
+ US_TV_MA = TvRat_6,
+ US_TV_None7 = TvRat_7
+} EnTvRat_US_TV;
+
+typedef enum
+{
+ CAE_TV_Exempt = TvRat_0,
+ CAE_TV_C = TvRat_1,
+ CAE_TV_C8 = TvRat_2,
+ CAE_TV_G = TvRat_3,
+ CAE_TV_PG = TvRat_4,
+ CAE_TV_14 = TvRat_5,
+ CAE_TV_18 = TvRat_6,
+ CAE_TV_Reserved = TvRat_7
+} EnTvRat_CAE_TV;
+
+typedef enum
+{
+ CAF_TV_Exempt = TvRat_0,
+ CAF_TV_G = TvRat_1,
+ CAF_TV_8 = TvRat_2,
+ CAF_TV_13 = TvRat_3,
+ CAF_TV_16 = TvRat_4,
+ CAF_TV_18 = TvRat_5,
+ CAF_TV_Reserved6 = TvRat_6,
+ CAF_TV_Reserved = TvRat_7
+} EnTvRat_CAF_TV;
+
+
+ // -------------------
+typedef enum
+{
+ BfAttrNone = 0, // no bits set (for initialization)
+ BfIsBlocked = 1, // if set,
+ BfIsAttr_1 = 2,
+ BfIsAttr_2 = 4,
+ BfIsAttr_3 = 8,
+ BfIsAttr_4 = 16,
+ BfIsAttr_5 = 32, // no bits set...
+ BfIsAttr_6 = 64,
+ BfIsAttr_7 = 128,
+ BfValidAttrSubmask = 255 // IsBlocked is not a valid attribute to display
+} BfEnTvRat_GenericAttributes;
+
+typedef enum
+{
+ US_TV_IsBlocked = BfIsBlocked,
+ US_TV_IsViolent = BfIsAttr_1,
+ US_TV_IsSexualSituation = BfIsAttr_2,
+ US_TV_IsAdultLanguage = BfIsAttr_3,
+ US_TV_IsSexuallySuggestiveDialog = BfIsAttr_4,
+ US_TV_ValidAttrSubmask = 31 // IsBlocked is not a valid attribute for TV
+} BfEnTvRat_Attributes_US_TV;
+
+typedef enum
+{
+ MPAA_IsBlocked = BfIsBlocked,
+ MPAA_ValidAttrSubmask = 1 // IsBlocked is not a valid attribute
+} BfEnTvRat_Attributes_MPAA;
+
+typedef enum
+{
+ CAE_IsBlocked = BfIsBlocked,
+ CAE_ValidAttrSubmask = 1 // IsBlocked is not a valid attribute
+} BfEnTvRat_Attributes_CAE_TV;
+
+typedef enum
+{
+ CAF_IsBlocked = BfIsBlocked,
+ CAF_ValidAttrSubmask = 1 // IsBlocked is not a valid attribute
+} BfEnTvRat_Attributes_CAF_TV;
+
+ // -------------------------------------------------------
+ // -------------------------------------------------------
+[
+ object,
+ uuid(C5C5C5B0-3ABC-11D6-B25B-00C04FA0C026),
+ dual,
+ helpstring("IXDSToRat Interface"),
+ pointer_default(unique)
+]
+interface IXDSToRat : IDispatch
+{
+ [id(1), helpstring("method Init")]
+ HRESULT Init();
+
+ [id(2), helpstring("method ParseXDSBytePair")]
+ HRESULT ParseXDSBytePair(
+ [in] BYTE byte1,
+ [in] BYTE byte2,
+ [out] EnTvRat_System *pEnSystem,
+ [out] EnTvRat_GenericLevel *pEnLevel,
+ [out] LONG *plBfEnAttributes // bitfield of BfEnTvRat_GenericAttributes
+ );
+};
+
+ // ------------------------
+[
+ object,
+ uuid(C5C5C5B1-3ABC-11D6-B25B-00C04FA0C026),
+ dual,
+ helpstring("IEvalRat Interface"),
+ pointer_default(unique)
+]
+interface IEvalRat : IDispatch
+{
+ [propget, id(1), helpstring("property BlockedRatingAttributes")]
+ HRESULT BlockedRatingAttributes(
+ [in] EnTvRat_System enSystem,
+ [in] EnTvRat_GenericLevel enLevel,
+ [out, retval] LONG *plbfAttrs // bitfield of BfEnTvRat_GenericAttributes
+ );
+
+ [propput, id(1), helpstring("property BlockedRatingAttributes")]
+ HRESULT BlockedRatingAttributes(
+ [in] EnTvRat_System enSystem,
+ [in] EnTvRat_GenericLevel enLevel,
+ [in] LONG lbfAttrs // bitfield of BfEnTvRat_GenericAttributes
+ );
+
+ [propget, id(2), helpstring("property BlockUnRated")]
+ HRESULT BlockUnRated(
+ [out, retval] BOOL *pfBlockUnRatedShows
+ );
+
+ [propput, id(2), helpstring("property BlockUnRated")]
+ HRESULT BlockUnRated(
+ [in] BOOL fBlockUnRatedShows
+ );
+
+ [ id(3), helpstring("method MostRestrictiveRating")]
+ HRESULT MostRestrictiveRating(
+ [in] EnTvRat_System enSystem1,
+ [in] EnTvRat_GenericLevel enEnLevel1,
+ [in] LONG lbfEnAttr1, // bitfield of BfEnTvRat_GenericAttributes
+ [in] EnTvRat_System enSystem2,
+ [in] EnTvRat_GenericLevel enEnLevel2,
+ [in] LONG lbfEnAttr2, // bitfield of BfEnTvRat_GenericAttributes
+ [out] EnTvRat_System *penSystem,
+ [out] EnTvRat_GenericLevel *penEnLevel,
+ [out] LONG *plbfEnAttr // bitfield of BfEnTvRat_GenericAttributes
+ );
+
+ [ id(4), helpstring("method TestRating")]
+ HRESULT TestRating(
+ [in] EnTvRat_System enShowSystem,
+ [in] EnTvRat_GenericLevel enShowLevel,
+ [in] LONG lbfEnShowAttributes // bitfield of BfEnTvRat_GenericAttributes
+ );
+
+};
+
+ // This is enforcing a particular implementation on folk...
+ // Don't need this particular TypeLib, just as long
+ // as some library/libraries exists that supports the two coClasses,
+ // with the give ClassID's.
+[
+ uuid(C5C5C500-3ABC-11D6-B25B-00C04FA0C026),
+ version(1.0),
+ helpstring("TvRatings 1.0 Type Library")
+]
+library TVRATINGSLib
+{
+ importlib("stdole32.tlb");
+ importlib("stdole2.tlb");
+
+ [
+ uuid(C5C5C5F0-3ABC-11D6-B25B-00C04FA0C026),
+ helpstring("XDSToRat Class")
+ ]
+ coclass XDSToRat
+ {
+ [default] interface IXDSToRat;
+ };
+ [
+ uuid(C5C5C5F1-3ABC-11D6-B25B-00C04FA0C026),
+ helpstring("EvalRat Class")
+ ]
+ coclass EvalRat
+ {
+ [default] interface IEvalRat;
+ };
+};
diff --git a/dxsdk/Include/DShowIDL/vidcap.idl b/dxsdk/Include/DShowIDL/vidcap.idl
new file mode 100644
index 00000000..523bfde3
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/vidcap.idl
@@ -0,0 +1,84 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// File: vidcap.idl
+//
+// Contents: Video Capture and Topology Interface Definitions
+//
+// History: first published in XP SP2 (ISelector,IKsTopologyInfo)
+//
+//--------------------------------------------------------------------------
+
+import "unknwn.idl";
+import "strmif.idl";
+
+// The preprocessor directives here ensure that KSTOPOLOGY_CONNECTION is defined in the correct way
+// Constraint is that ks.h cannot be included in the idl file. The directives below ensure that
+// 1) KSTOPOLOGY_CONNECTION is locally defined for purposes of building the idl file itself.
+// 2) An app can include vidcap.h and ks.h in either order.
+// 3) The structure definition for KSTOPOLOGY_CONNECTION does not show up in vidcap.h since ks.h gets included.
+// Look at vidcap.h to understand exactly what gets generated.
+cpp_quote("#include \"ks.h\"")
+cpp_quote("#ifndef _KS_")
+typedef struct {
+ ULONG FromNode;
+ ULONG FromNodePin;
+ ULONG ToNode;
+ ULONG ToNodePin;
+} KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
+cpp_quote("#endif")
+
+
+// IKsTopologyInfo interface
+[
+ object,
+ local,
+ uuid(720D4AC0-7533-11D0-A5D6-28DB04C10000),
+ pointer_default(unique)
+]
+interface IKsTopologyInfo : IUnknown
+{
+ HRESULT get_NumCategories([out] DWORD *pdwNumCategories);
+ HRESULT get_Category([in] DWORD dwIndex, [out] GUID *pCategory);
+ HRESULT get_NumConnections([out] DWORD *pdwNumConnections);
+ HRESULT get_ConnectionInfo([in] DWORD dwIndex, [out] KSTOPOLOGY_CONNECTION *pConnectionInfo);
+ HRESULT get_NodeName([in] DWORD dwNodeId, [out] WCHAR *pwchNodeName, [in] DWORD dwBufSize, [out] DWORD *pdwNameLen);
+ HRESULT get_NumNodes([out] DWORD *pdwNumNodes);
+ HRESULT get_NodeType([in] DWORD dwNodeId, [out] GUID *pNodeType);
+ HRESULT CreateNodeInstance([in] DWORD dwNodeId, [in] REFIID iid, [out] void **ppvObject);
+}
+
+
+// ISelector interface
+[
+ object,
+ local,
+ uuid(1ABDAECA-68B6-4F83-9371-B413907C7B9F),
+ pointer_default(unique)
+]
+interface ISelector : IUnknown
+{
+ HRESULT get_NumSources([out] DWORD *pdwNumSources);
+ HRESULT get_SourceNodeId([out] DWORD *pdwPinId);
+ HRESULT put_SourceNodeId([in] DWORD dwPinId);
+}
+
+
+// IKsNodeControl interface
+[
+ object,
+ local,
+ uuid(11737C14-24A7-4bb5-81A0-0D003813B0C4),
+ pointer_default(unique)
+]
+interface IKsNodeControl :IUnknown
+{
+ HRESULT put_NodeId([in] DWORD dwNodeId);
+ HRESULT put_KsControl([in] PVOID pKsControl);
+}
+
+
+
+
diff --git a/dxsdk/Include/DShowIDL/vmr9.idl b/dxsdk/Include/DShowIDL/vmr9.idl
new file mode 100644
index 00000000..ae9245f2
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/vmr9.idl
@@ -0,0 +1,1057 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Public Interfaces for the DX9 Video Mixing Renderer DShow filter
+//
+// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
+///////////////////////////////////////////////////////////////////////////////
+
+import "unknwn.idl";
+
+
+cpp_quote("#if 0")
+// This is temporary work around to persuade
+// MIDL to allow forward declarations.
+typedef DWORD IDirect3DDevice9;
+typedef DWORD IDirect3DSurface9;
+typedef DWORD D3DFORMAT;
+typedef DWORD D3DCOLOR;
+typedef DWORD D3DPOOL;
+typedef LONGLONG REFERENCE_TIME;
+typedef DWORD* HMONITOR;
+typedef struct {DWORD dw1; DWORD dw2;} AM_MEDIA_TYPE;
+cpp_quote ("#endif")
+
+
+// public interfaces supported by the VMR9
+
+interface IVMRSurface9;
+
+interface IVMRSurfaceAllocator9;
+interface IVMRSurfaceAllocatorNotify9;
+interface IVMRImagePresenter9;
+interface IVMRImagePresenterConfig9;
+interface IVMRMonitorConfig9;
+interface IVMRWindowlessControl9;
+
+interface IVMRMixerControl9;
+interface IVMRImageCompositor9;
+interface IVMRMixerBitmap9;
+
+
+interface IVMRFilterConfig9;
+interface IVMRAspectRatioControl9;
+interface IVMRVideoStreamControl9;
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Allocator Presenter interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+
+
+
+//=====================================================================
+//
+// IVMRImagePresenter9
+//
+//=====================================================================
+typedef enum {
+ VMR9Sample_SyncPoint = 0x00000001,
+ VMR9Sample_Preroll = 0x00000002,
+ VMR9Sample_Discontinuity = 0x00000004,
+ VMR9Sample_TimeValid = 0x00000008,
+ VMR9Sample_SrcDstRectsValid= 0x00000010
+} VMR9PresentationFlags;
+
+
+typedef struct _VMR9PresentationInfo {
+ DWORD dwFlags;
+ IDirect3DSurface9* lpSurf;
+ REFERENCE_TIME rtStart;
+ REFERENCE_TIME rtEnd;
+ SIZE szAspectRatio;
+ RECT rcSrc;
+ RECT rcDst;
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+} VMR9PresentationInfo;
+
+[
+ local,
+ object,
+ local,
+ uuid(69188c61-12a3-40f0-8ffc-342e7b433fd7),
+ helpstring("IVMRImagePresenter9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRImagePresenter9 : IUnknown
+{
+ HRESULT StartPresenting(
+ [in] DWORD_PTR dwUserID
+ );
+
+ HRESULT StopPresenting(
+ [in] DWORD_PTR dwUserID
+ );
+
+ HRESULT PresentImage(
+ [in] DWORD_PTR dwUserID,
+ [in] VMR9PresentationInfo* lpPresInfo
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRSurfaceAllocator
+//
+//=====================================================================
+typedef enum {
+ // surface types/usage
+ VMR9AllocFlag_3DRenderTarget = 0x0001,
+ VMR9AllocFlag_DXVATarget = 0x0002,
+
+ //
+ // VMR9AllocFlag_TextureSurface can be combined with
+ // DXVATarget and 3DRenderTarget
+ //
+ VMR9AllocFlag_TextureSurface = 0x0004,
+ VMR9AllocFlag_OffscreenSurface = 0x0008,
+ VMR9AllocFlag_UsageReserved = 0x00F0,
+ VMR9AllocFlag_UsageMask = 0x00FF
+
+ // surface
+} VMR9SurfaceAllocationFlags;
+
+
+typedef struct _VMR9AllocationInfo {
+ DWORD dwFlags; // see VMR9SurfaceAllocationFlags
+ DWORD dwWidth;
+ DWORD dwHeight;
+ D3DFORMAT Format; // 0 means use a format compatible with the display
+ D3DPOOL Pool;
+ DWORD MinBuffers;
+ SIZE szAspectRatio;
+ SIZE szNativeSize;
+} VMR9AllocationInfo;
+
+[
+ local,
+ object,
+ local,
+ uuid(8d5148ea-3f5d-46cf-9df1-d1b896eedb1f),
+ helpstring("IVMRSurfaceAllocator9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRSurfaceAllocator9 : IUnknown
+{
+ HRESULT InitializeDevice(
+ [in] DWORD_PTR dwUserID,
+ [in] VMR9AllocationInfo* lpAllocInfo,
+ [in, out] DWORD* lpNumBuffers
+ );
+
+ HRESULT TerminateDevice(
+ [in] DWORD_PTR dwID
+ );
+
+ HRESULT GetSurface(
+ [in] DWORD_PTR dwUserID,
+ [in] DWORD SurfaceIndex,
+ [in] DWORD SurfaceFlags,
+ [out] IDirect3DSurface9** lplpSurface
+ );
+
+ HRESULT AdviseNotify(
+ [in] IVMRSurfaceAllocatorNotify9* lpIVMRSurfAllocNotify
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRSurfaceAllocatorNotify9
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(dca3f5df-bb3a-4d03-bd81-84614bfbfa0c),
+ helpstring("IVMRSurfaceAllocatorNotify9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRSurfaceAllocatorNotify9 : IUnknown
+{
+ HRESULT AdviseSurfaceAllocator(
+ [in] DWORD_PTR dwUserID,
+ [in] IVMRSurfaceAllocator9* lpIVRMSurfaceAllocator
+ );
+
+ HRESULT SetD3DDevice(
+ [in] IDirect3DDevice9* lpD3DDevice,
+ [in] HMONITOR hMonitor
+ );
+
+ HRESULT ChangeD3DDevice(
+ [in] IDirect3DDevice9* lpD3DDevice,
+ [in] HMONITOR hMonitor
+ );
+
+ HRESULT AllocateSurfaceHelper(
+ [in] VMR9AllocationInfo* lpAllocInfo,
+ [in, out] DWORD* lpNumBuffers,
+ [out] IDirect3DSurface9** lplpSurface
+ );
+
+ HRESULT NotifyEvent(
+ [in] LONG EventCode,
+ [in] LONG_PTR Param1,
+ [in] LONG_PTR Param2
+ );
+};
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Application control and configuration interfaces
+//
+///////////////////////////////////////////////////////////////////////////////
+
+
+//=====================================================================
+//
+// IVMRWindowlessControl9
+//
+//=====================================================================
+typedef enum {
+ VMR9ARMode_None,
+ VMR9ARMode_LetterBox
+} VMR9AspectRatioMode;
+
+[
+ local,
+ object,
+ local,
+ uuid(8f537d09-f85e-4414-b23b-502e54c79927),
+ helpstring("IVMRWindowlessControl Interface"),
+ pointer_default(unique)
+]
+interface IVMRWindowlessControl9 : IUnknown
+{
+ //
+ //////////////////////////////////////////////////////////
+ // Video size and position information
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT GetNativeVideoSize(
+ [out] LONG* lpWidth,
+ [out] LONG* lpHeight,
+ [out] LONG* lpARWidth,
+ [out] LONG* lpARHeight
+ );
+
+ HRESULT GetMinIdealVideoSize(
+ [out] LONG* lpWidth,
+ [out] LONG* lpHeight
+ );
+
+ HRESULT GetMaxIdealVideoSize(
+ [out] LONG* lpWidth,
+ [out] LONG* lpHeight
+ );
+
+ HRESULT SetVideoPosition(
+ [in] const LPRECT lpSRCRect,
+ [in] const LPRECT lpDSTRect
+ );
+
+ HRESULT GetVideoPosition(
+ [out] LPRECT lpSRCRect,
+ [out] LPRECT lpDSTRect
+ );
+
+ HRESULT GetAspectRatioMode(
+ [out] DWORD* lpAspectRatioMode
+ );
+
+ HRESULT SetAspectRatioMode(
+ [in] DWORD AspectRatioMode
+ );
+
+ //
+ //////////////////////////////////////////////////////////
+ // Display and clipping management
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT SetVideoClippingWindow(
+ [in] HWND hwnd
+ );
+
+ HRESULT RepaintVideo(
+ [in] HWND hwnd,
+ [in] HDC hdc
+ );
+
+ HRESULT DisplayModeChanged();
+
+
+ //
+ //////////////////////////////////////////////////////////
+ // GetCurrentImage
+ //
+ // Returns the current image being displayed. This images
+ // is returned in the form of packed Windows DIB.
+ //
+ // GetCurrentImage can be called at any time, also
+ // the caller is responsible for free the returned memory
+ // by calling CoTaskMemFree.
+ //
+ // Excessive use of this function will degrade video
+ // playback performed.
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT GetCurrentImage(
+ [out] BYTE** lpDib
+ );
+
+ //
+ //////////////////////////////////////////////////////////
+ // Border Color control
+ //
+ // The border color is color used to fill any area of the
+ // the destination rectangle that does not contain video.
+ // It is typically used in two instances. When the video
+ // straddles two monitors and when the VMR is trying
+ // to maintain the aspect ratio of the movies by letter
+ // boxing the video to fit within the specified destination
+ // rectangle. See SetAspectRatioMode above.
+ //////////////////////////////////////////////////////////
+ //
+ HRESULT SetBorderColor(
+ [in] COLORREF Clr
+ );
+
+ HRESULT GetBorderColor(
+ [out] COLORREF* lpClr
+ );
+};
+
+
+
+//=====================================================================
+//
+// IVMRMixerControl9
+//
+//=====================================================================
+
+typedef enum {
+ MixerPref9_NoDecimation = 0x00000001, // No decimation - full size
+ MixerPref9_DecimateOutput = 0x00000002, // decimate output by 2 in x & y
+ MixerPref9_ARAdjustXorY = 0x00000004, // adjust the aspect ratio in x or y
+ MixerPref9_NonSquareMixing = 0x00000008, // assume AP can handle non-square mixing, avoids intermediate scales
+ MixerPref9_DecimateMask = 0x0000000F,
+
+ MixerPref9_BiLinearFiltering = 0x00000010, // use bi-linear filtering
+ MixerPref9_PointFiltering = 0x00000020, // use point filtering
+ MixerPref9_AnisotropicFiltering = 0x00000040, //
+ MixerPref9_PyramidalQuadFiltering = 0x00000080, // 4-sample tent
+ MixerPref9_GaussianQuadFiltering = 0x00000100, // 4-sample gaussian
+ MixerPref9_FilteringReserved = 0x00000E00, // bits reserved for future use.
+ MixerPref9_FilteringMask = 0x00000FF0, // OR of all above flags
+
+ MixerPref9_RenderTargetRGB = 0x00001000,
+ MixerPref9_RenderTargetYUV = 0x00002000, // Uses DXVA to perform mixing
+ MixerPref9_RenderTargetReserved = 0x000FC000, // bits reserved for future use.
+ MixerPref9_RenderTargetMask = 0x000FF000, // OR of all above flags
+
+ //
+ // Dynamic changes that can be performed when the VMR's mixer is
+ // configured to use the YUV Render target (see MixerPref_RenderTargetYUV)
+ // These preferences can be applied while the graph is running and take effect
+ // when the next frame is composed by the mixer.
+ //
+ MixerPref9_DynamicSwitchToBOB = 0x00100000,
+ MixerPref9_DynamicDecimateBy2 = 0x00200000,
+
+ MixerPref9_DynamicReserved = 0x00C00000,
+ MixerPref9_DynamicMask = 0x00F00000
+
+} VMR9MixerPrefs;
+
+
+//
+// Normalized relative rectangle
+// Coordinate ranges: x=[0...1) y=[0...1)
+// Where the output window goes from 0,0 (closed inclusive lower bound)
+// to 1,1 (open exclusive upper bound)
+//
+typedef struct _VMR9NormalizedRect
+{
+ float left;
+ float top;
+ float right;
+ float bottom;
+} VMR9NormalizedRect;
+
+
+
+typedef enum {
+ ProcAmpControl9_Brightness = 0x00000001,
+ ProcAmpControl9_Contrast = 0x00000002,
+ ProcAmpControl9_Hue = 0x00000004,
+ ProcAmpControl9_Saturation = 0x00000008,
+ ProcAmpControl9_Mask = 0x0000000F
+} VMR9ProcAmpControlFlags;
+
+typedef struct _VMR9ProcAmpControl
+{
+ DWORD dwSize;
+ DWORD dwFlags;
+ float Brightness;
+ float Contrast;
+ float Hue;
+ float Saturation;
+} VMR9ProcAmpControl;
+
+typedef struct _VMR9ProcAmpControlRange
+{
+ DWORD dwSize;
+ VMR9ProcAmpControlFlags dwProperty; // see VMR9ProcAmpControlFlags above
+ float MinValue;
+ float MaxValue;
+ float DefaultValue;
+ float StepSize;
+} VMR9ProcAmpControlRange;
+
+
+[
+ local,
+ object,
+ local,
+ uuid(1a777eaa-47c8-4930-b2c9-8fee1c1b0f3b),
+ helpstring("IVMRMixerControl9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRMixerControl9 : IUnknown
+{
+ HRESULT SetAlpha(
+ [in] DWORD dwStreamID,
+ [in] float Alpha // Source alpha premultication factor (global alpha for source)
+ );
+
+ HRESULT GetAlpha(
+ [in] DWORD dwStreamID,
+ [out] float* pAlpha
+ );
+
+ HRESULT SetZOrder(
+ [in] DWORD dwStreamID,
+ [in] DWORD dwZ
+ );
+
+ HRESULT GetZOrder(
+ [in] DWORD dwStreamID,
+ [out] DWORD* pZ
+ );
+
+ HRESULT SetOutputRect(
+ [in] DWORD dwStreamID,
+ [in] const VMR9NormalizedRect *pRect
+ );
+
+ HRESULT GetOutputRect(
+ [in] DWORD dwStreamID,
+ [out] VMR9NormalizedRect *pRect
+ );
+
+ HRESULT SetBackgroundClr(
+ [in] COLORREF ClrBkg
+ );
+
+ HRESULT GetBackgroundClr(
+ [in] COLORREF* lpClrBkg
+ );
+
+ HRESULT SetMixingPrefs(
+ [in] DWORD dwMixerPrefs // a combination of VMRMixingPrefFlags
+ );
+
+ HRESULT GetMixingPrefs(
+ [out] DWORD* pdwMixerPrefs
+ );
+
+ HRESULT SetProcAmpControl(
+ [in] DWORD dwStreamID,
+ [in] VMR9ProcAmpControl* lpClrControl
+ );
+
+ HRESULT GetProcAmpControl(
+ [in] DWORD dwStreamID,
+ [in, out] VMR9ProcAmpControl* lpClrControl
+ );
+
+ HRESULT GetProcAmpControlRange(
+ [in] DWORD dwStreamID,
+ [in, out] VMR9ProcAmpControlRange* lpClrControl
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRMixerBitmap9
+//
+//=====================================================================
+
+typedef struct _VMR9AlphaBitmap
+{
+ DWORD dwFlags; // flags word
+ HDC hdc; // DC for the bitmap to copy
+ IDirect3DSurface9* pDDS; // D3D surface to copy
+ RECT rSrc; // rectangle to copy from the DC/DDS
+ VMR9NormalizedRect rDest; // output rectangle in composition space
+ FLOAT fAlpha; // opacity of the bitmap
+ COLORREF clrSrcKey; // src color key
+ DWORD dwFilterMode; // See "SetMixerPrefs"
+} VMR9AlphaBitmap;
+
+
+typedef enum {
+
+ // Disable the alpha bitmap for now
+ VMR9AlphaBitmap_Disable = 0x00000001,
+
+ // Take the bitmap from the HDC rather than the DirectDraw surface
+ VMR9AlphaBitmap_hDC = 0x00000002,
+
+ // Take the entire DDraw surface - rSrc is ignored
+ VMR9AlphaBitmap_EntireDDS = 0x00000004,
+
+ // Indicates that the clrTrans value is valid and should be
+ // used when blending
+ VMR9AlphaBitmap_SrcColorKey = 0x00000008,
+
+ // Indicates that the rSrc rectangle is valid and specifies a
+ // sub-rectangle of the of original app image to be blended.
+ // Use of this parameter enables "Image Strips"
+ VMR9AlphaBitmap_SrcRect = 0x00000010,
+
+ // Indicates that dwFilterMode parameter is valid and should be
+ // used to overide the default filtering method used by the VMR.
+ // MixerPref_PointFiltering is particulaly useful for images that
+ // contain text and do not need to be stretch prior to blending with
+ // the video content.
+ VMR9AlphaBitmap_FilterMode = 0x00000020
+} VMR9AlphaBitmapFlags;
+
+[
+ object,
+ local,
+ uuid(ced175e5-1935-4820-81bd-ff6ad00c9108),
+ helpstring("IVMRMixerBitmap Interface"),
+ pointer_default(unique)
+]
+interface IVMRMixerBitmap9 : IUnknown
+{
+ // Set bitmap, location to blend it, and blending value
+ HRESULT SetAlphaBitmap(
+ [in] const VMR9AlphaBitmap* pBmpParms
+ );
+
+ // Change bitmap location, size and blending value,
+ // graph must be running for change to take effect.
+ HRESULT UpdateAlphaBitmapParameters(
+ [in] const VMR9AlphaBitmap* pBmpParms
+ );
+
+ // Get bitmap, location to blend it, and blending value
+ HRESULT GetAlphaBitmapParameters(
+ [out] VMR9AlphaBitmap* pBmpParms
+ );
+};
+
+
+
+//=====================================================================
+//
+// IVMRSurface9
+//
+//=====================================================================
+[
+ local,
+ object,
+ local,
+ uuid(dfc581a1-6e1f-4c3a-8d0a-5e9792ea2afc),
+ helpstring("IVMRSurface Interface"),
+ pointer_default(unique)
+]
+interface IVMRSurface9 : IUnknown
+{
+ HRESULT IsSurfaceLocked();
+
+ HRESULT LockSurface(
+ [out] BYTE** lpSurface
+ );
+
+ HRESULT UnlockSurface();
+
+ HRESULT GetSurface(
+ [out] IDirect3DSurface9** lplpSurface
+ );
+};
+
+
+
+//=====================================================================
+//
+// IID_IVMRImagePresenterConfig9 - this interface allows applications
+// to configure the default Microsoft provided allocator-presenter
+// inorder to simplify the implementation of their own
+// allocator-presenter plug-in.
+//
+//=====================================================================
+typedef enum {
+ RenderPrefs9_DoNotRenderBorder = 0x00000001, // app paints color keys
+ RenderPrefs9_Mask = 0x00000001, // OR of all above flags
+} VMR9RenderPrefs;
+[
+ local,
+ object,
+ local,
+ uuid(45c15cab-6e22-420a-8043-ae1f0ac02c7d),
+ helpstring("IVMRImagePresenterConfig9 Interface"),
+ pointer_default(unique)
+]
+
+interface IVMRImagePresenterConfig9 : IUnknown
+{
+
+ HRESULT SetRenderingPrefs(
+ [in] DWORD dwRenderFlags // see VMRRenderPrefs for valid flags
+ );
+
+ HRESULT GetRenderingPrefs(
+ [out] DWORD* dwRenderFlags // see VMRRenderPrefs for valid flags
+ );
+
+}
+
+
+
+
+//=====================================================================
+//
+// IVMRVideoStreamControl9
+//
+//=====================================================================
+[
+ object,
+ local,
+ uuid(d0cfe38b-93e7-4772-8957-0400c49a4485),
+ helpstring("IVMRMixerStreamConfig Interface"),
+ pointer_default(unique)
+]
+interface IVMRVideoStreamControl9: IUnknown
+{
+
+ HRESULT SetStreamActiveState(
+ [in] BOOL fActive
+ );
+
+ HRESULT GetStreamActiveState(
+ [out] BOOL* lpfActive
+ );
+};
+
+
+typedef enum {
+ VMR9Mode_Windowed = 0x00000001,
+ VMR9Mode_Windowless = 0x00000002,
+ VMR9Mode_Renderless = 0x00000004,
+
+ // not a valid value to pass to SetRenderMode
+ VMR9Mode_Mask = 0x00000007, // OR of all above flags
+} VMR9Mode;
+
+[
+ object,
+ local,
+ uuid(5a804648-4f66-4867-9c43-4f5c822cf1b8),
+ helpstring("IVMRFilterConfig9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRFilterConfig9 : IUnknown
+{
+ HRESULT SetImageCompositor(
+ [in] IVMRImageCompositor9* lpVMRImgCompositor
+ );
+
+ HRESULT SetNumberOfStreams(
+ [in] DWORD dwMaxStreams
+ );
+
+ HRESULT GetNumberOfStreams(
+ [out] DWORD* pdwMaxStreams
+ );
+
+ HRESULT SetRenderingPrefs(
+ [in] DWORD dwRenderFlags // a combination of VMR9RenderPrefs
+ );
+
+ HRESULT GetRenderingPrefs(
+ [out] DWORD* pdwRenderFlags
+ );
+
+ HRESULT SetRenderingMode(
+ [in] DWORD Mode // a combination of VMRMode
+ );
+
+ HRESULT GetRenderingMode(
+ [out] DWORD* pMode
+ );
+}
+
+//=====================================================================
+//
+// IVMRAspectRatioControl9
+//
+//=====================================================================
+[
+ object,
+ local,
+ uuid(00d96c29-bbde-4efc-9901-bb5036392146),
+ helpstring("IVMRAspectRatioControl9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRAspectRatioControl9 : IUnknown
+{
+ HRESULT GetAspectRatioMode(
+ [out] LPDWORD lpdwARMode
+ );
+
+ HRESULT SetAspectRatioMode(
+ [in] DWORD dwARMode
+ );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// VMR Multimon configuration interface
+//
+///////////////////////////////////////////////////////////////////////////////
+#define VMR9DEVICENAMELEN 32
+#define VMR9DEVICEDESCRIPTIONLEN 512
+
+typedef struct _VMR9MonitorInfo {
+ UINT uDevID;
+ RECT rcMonitor;
+ HMONITOR hMon;
+ DWORD dwFlags; // described in MONITORINFOEX, currently only MONITORINFOF_PRIMARY
+ wchar_t szDevice[VMR9DEVICENAMELEN];
+ wchar_t szDescription[VMR9DEVICEDESCRIPTIONLEN];
+ LARGE_INTEGER liDriverVersion;
+ DWORD dwVendorId;
+ DWORD dwDeviceId;
+ DWORD dwSubSysId;
+ DWORD dwRevision;
+ //
+} VMR9MonitorInfo;
+
+[
+ object,
+ local,
+ uuid(46c2e457-8ba0-4eef-b80b-0680f0978749),
+ helpstring("IVMRMonitorConfig9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRMonitorConfig9 : IUnknown
+{
+ // Use this method on a Multi-Monitor system to specify to the
+ // mixer filter which Direct Draw driver should be used when connecting
+ // to an upstream decoder filter.
+ //
+ HRESULT SetMonitor(
+ [in] UINT uDev
+ );
+
+ // Use this method to determine the direct draw object that will be used when
+ // connecting the mixer filter to an upstream decoder filter.
+ //
+ HRESULT GetMonitor(
+ [out] UINT *puDev
+ );
+
+ // Use this method on a multi-monitor system to specify to the
+ // mixer filter the default Direct Draw device to use when
+ // connecting to an upstream filter. The default direct draw device
+ // can be overriden for a particular connection by SetMonitor method
+ // described above.
+ //
+ HRESULT SetDefaultMonitor(
+ [in] UINT uDev
+ );
+
+ // Use this method on a multi-monitor system to determine which
+ // is the default direct draw device the overlay mixer filter
+ // will use when connecting to an upstream filter.
+ //
+ HRESULT GetDefaultMonitor(
+ [out] UINT* puDev
+ );
+
+ // Use this method to get a list of Direct Draw device GUIDs and thier
+ // associated monitor information that the mixer can use when
+ // connecting to an upstream decoder filter. Passing down a NULL pInfo
+ // parameter allows the app to determine the required array size (returned
+ // in pdwNumDevices). Otherwise, dwNumDevices returns the actual
+ // number of devices retrieved.
+ //
+ HRESULT GetAvailableMonitors(
+ [out, size_is(dwMaxInfoArraySize)] VMR9MonitorInfo* pInfo,
+ [in] DWORD dwMaxInfoArraySize, // in array members
+ [out] DWORD* pdwNumDevices // actual number of devices retrieved
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRDeinterlaceControl
+//
+// New interfaced introduced into the WindowsXP SP1 release of the VMR.
+// This interface allows applications to control the DX-VA deinterlacing
+// support provided by the VMR.
+//
+// The VMR needs to be set into "mixing" mode for this interface to work.
+//
+// SetDeinterlaceMode is only effective for new connections made to the
+// VMR. It should be noted that the graphics device driver may refuse
+// to use the specified deinterlace mode, in which case 3 fallback
+// policies are offered by the VMR, these being:
+//
+// 1. Fallback to the next best mode offered by the driver.
+// 2. Fallback to the BOB deinterlace mode.
+// 3. Fallback to the WEAVE deinterlace mode (ie. turn deinterlacing off).
+//
+//=====================================================================
+
+typedef enum {
+ DeinterlacePref9_NextBest = 0x01,
+ DeinterlacePref9_BOB = 0x02,
+ DeinterlacePref9_Weave = 0x04,
+ DeinterlacePref9_Mask = 0x07
+} VMR9DeinterlacePrefs;
+
+typedef enum {
+
+ // the algorithm is unknown or proprietary
+ DeinterlaceTech9_Unknown = 0x0000,
+
+ // the algorithm creates the missing lines by repeating
+ // the line either above or below it - this method will look very jaggy and
+ // isn't recommended
+ DeinterlaceTech9_BOBLineReplicate = 0x0001,
+
+
+ // the algorithm creates the missing lines by vertically stretching each
+ // video field by a factor of two, for example by averaging two lines or
+ // using a [-1, 9, 9, -1]/16 filter across four lines.
+ // Slight vertical adjustments are made to ensure that the resulting image
+ // does not "bob" up and down.
+ DeinterlaceTech9_BOBVerticalStretch = 0x0002,
+
+ // the pixels in the missing line are recreated by a median filtering operation
+ DeinterlaceTech9_MedianFiltering = 0x0004,
+
+ // the pixels in the missing line are recreated by an edge filter.
+ // In this process, spatial directional filters are applied to determine
+ // the orientation of edges in the picture content, and missing
+ // pixels are created by filtering along (rather than across) the
+ // detected edges.
+ DeinterlaceTech9_EdgeFiltering = 0x0010,
+
+ // the pixels in the missing line are recreated by switching on a field by
+ // field basis between using either spatial or temporal interpolation
+ // depending on the amount of motion.
+ DeinterlaceTech9_FieldAdaptive = 0x0020,
+
+ // the pixels in the missing line are recreated by switching on a pixel by pixel
+ // basis between using either spatial or temporal interpolation depending on
+ // the amount of motion..
+ DeinterlaceTech9_PixelAdaptive = 0x0040,
+
+ // Motion Vector Steering identifies objects within a sequence of video
+ // fields. The missing pixels are recreated after first aligning the
+ // movement axes of the individual objects in the scene to make them
+ // parallel with the time axis.
+ DeinterlaceTech9_MotionVectorSteered = 0x0080
+
+} VMR9DeinterlaceTech;
+
+typedef struct _VMR9Frequency {
+ DWORD dwNumerator;
+ DWORD dwDenominator;
+} VMR9Frequency;
+
+typedef enum _VMR9_SampleFormat {
+ VMR9_SampleReserved = 1,
+ VMR9_SampleProgressiveFrame = 2,
+ VMR9_SampleFieldInterleavedEvenFirst = 3,
+ VMR9_SampleFieldInterleavedOddFirst = 4,
+ VMR9_SampleFieldSingleEven = 5,
+ VMR9_SampleFieldSingleOdd = 6,
+} VMR9_SampleFormat;
+
+typedef struct _VMR9VideoDesc {
+ DWORD dwSize;
+ DWORD dwSampleWidth;
+ DWORD dwSampleHeight;
+ VMR9_SampleFormat SampleFormat;
+ DWORD dwFourCC;
+ VMR9Frequency InputSampleFreq;
+ VMR9Frequency OutputFrameFreq;
+} VMR9VideoDesc;
+
+
+typedef struct _VMR9DeinterlaceCaps {
+ DWORD dwSize;
+ DWORD dwNumPreviousOutputFrames;
+ DWORD dwNumForwardRefSamples;
+ DWORD dwNumBackwardRefSamples;
+ VMR9DeinterlaceTech DeinterlaceTechnology;
+} VMR9DeinterlaceCaps;
+
+[
+ object,
+ local,
+ uuid(a215fb8d-13c2-4f7f-993c-003d6271a459),
+ helpstring("IVMRDeinterlaceControl9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRDeinterlaceControl9 : IUnknown
+{
+ //
+ // For the specified video description returns the
+ // number of deinterlacing modes available to the VMR.
+ // The deinterlacing modes are returned in descending
+ // quality order ie. the best quality mode is at
+ // lpdwNumDeinterlaceModes[0], the next best at
+ // lpdwNumDeinterlaceModes[1] and so on.
+ //
+ // To determine how big an array of guids to pass to the
+ // GetNumberOfDeinterlaceModes method call
+ // GetNumberOfDeinterlaceModes(lpVideoDescription, &dwNumModes, NULL);
+ //
+ HRESULT GetNumberOfDeinterlaceModes(
+ [in] VMR9VideoDesc* lpVideoDescription,
+ [in] [out] LPDWORD lpdwNumDeinterlaceModes,
+ [out] LPGUID lpDeinterlaceModes
+ );
+
+ //
+ // For the given video description get the capabilities of the
+ // specified de-interlace mode.
+ //
+ HRESULT GetDeinterlaceModeCaps(
+ [in] LPGUID lpDeinterlaceMode,
+ [in] VMR9VideoDesc* lpVideoDescription,
+ [out] VMR9DeinterlaceCaps* lpDeinterlaceCaps
+ );
+
+ //
+ // Get/Set the deinterlace mode that you would like the
+ // VMR to use when de-interlacing the specified stream.
+ // It should be noted that the VMR may not actually be able
+ // to use the requested deinterlace mode, in which case the
+ // the VMR will fall back to other de-interlace modes as specified
+ // by the de-interlace preferences (see SetDeinterlacePrefs below).
+ //
+ HRESULT GetDeinterlaceMode(
+ [in] DWORD dwStreamID,
+ [out] LPGUID lpDeinterlaceMode // returns GUID_NULL if SetDeinterlaceMode
+ ); // has not been called yet.
+
+ HRESULT SetDeinterlaceMode(
+ [in] DWORD dwStreamID, // use 0xFFFFFFFF to set mode for all streams
+ [in] LPGUID lpDeinterlaceMode // GUID_NULL == turn deinterlacing off
+ );
+
+
+ HRESULT GetDeinterlacePrefs(
+ [out] LPDWORD lpdwDeinterlacePrefs
+ );
+
+ HRESULT SetDeinterlacePrefs(
+ [in] DWORD dwDeinterlacePrefs
+ );
+
+ //
+ // Get the DeinterlaceMode currently in use for the specified
+ // video stream (ie. pin). The returned GUID will be NULL if
+ // the de-interlacing h/w has not been created by the VMR at the
+ // time the function is called, or if the VMR determines that
+ // this stream should not or can be de-interlaced.
+ //
+ HRESULT GetActualDeinterlaceMode(
+ [in] DWORD dwStreamID,
+ [out] LPGUID lpDeinterlaceMode
+ );
+};
+
+
+//=====================================================================
+//
+// IVMRImageCompositor9
+//
+//=====================================================================
+
+typedef struct _VMR9VideoStreamInfo {
+ IDirect3DSurface9* pddsVideoSurface;
+ DWORD dwWidth, dwHeight;
+ DWORD dwStrmID;
+ FLOAT fAlpha;
+ VMR9NormalizedRect rNormal;
+ REFERENCE_TIME rtStart;
+ REFERENCE_TIME rtEnd;
+ VMR9_SampleFormat SampleFormat;
+} VMR9VideoStreamInfo;
+[
+ local,
+ object,
+ local,
+ uuid(4a5c89eb-df51-4654-ac2a-e48e02bbabf6),
+ helpstring("IVMRImageCompositor9 Interface"),
+ pointer_default(unique)
+]
+interface IVMRImageCompositor9 : IUnknown
+{
+ HRESULT InitCompositionDevice(
+ [in] IUnknown* pD3DDevice
+ );
+
+ HRESULT TermCompositionDevice(
+ [in] IUnknown* pD3DDevice
+ );
+
+ HRESULT SetStreamMediaType(
+ [in] DWORD dwStrmID,
+ [in] AM_MEDIA_TYPE* pmt,
+ [in] BOOL fTexture
+ );
+
+ HRESULT CompositeImage(
+ [in] IUnknown* pD3DDevice,
+ [in] IDirect3DSurface9* pddsRenderTarget,
+ [in] AM_MEDIA_TYPE* pmtRenderTarget,
+ [in] REFERENCE_TIME rtStart,
+ [in] REFERENCE_TIME rtEnd,
+ [in] D3DCOLOR dwClrBkGnd,
+ [in] VMR9VideoStreamInfo* pVideoStreamInfo,
+ [in] UINT cStreams
+ );
+};