diff options
author | Fire-Head <Fire-Head@users.noreply.github.com> | 2019-06-02 05:00:38 +0200 |
---|---|---|
committer | Fire-Head <Fire-Head@users.noreply.github.com> | 2019-06-02 05:00:38 +0200 |
commit | b1f9e28cd155459ab2843690c248ed9f4767bc3f (patch) | |
tree | 8e7d2a33d4c5109ea3c3562940268afc57d0915c /dxsdk/Include/DShowIDL | |
parent | rw skeleton (diff) | |
download | re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.tar re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.tar.gz re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.tar.bz2 re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.tar.lz re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.tar.xz re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.tar.zst re3-b1f9e28cd155459ab2843690c248ed9f4767bc3f.zip |
Diffstat (limited to '')
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 + ); +}; |