//*@@@+++@@@@******************************************************************
//
// Microsoft Windows Media
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//*@@@---@@@@******************************************************************
//
cpp_quote( "//=========================================================================" )
cpp_quote( "//" )
cpp_quote( "// Microsoft Windows Media Technologies" )
cpp_quote( "// Copyright (C) Microsoft Corporation.  All Rights Reserved." )
cpp_quote( "//" )
cpp_quote( "//=========================================================================" )

///////////////////////////////////////////////////////////////////////////////
//
// Enumerations and constants used by the SDK.
//
///////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
//
// Imports, typedefs and forward declarations
//
import "oaidl.idl";
import "wmsbuffer.idl";
import "drmexternals.idl";

typedef unsigned __int64 QWORD;

//
// Forward declarations of a few interfaces, so that things compile:
//
interface IWMMediaProps;
interface IWMVideoMediaProps;

interface IWMWriter;
interface IWMInputMediaProps;

interface IWMReader;
interface IWMOutputMediaProps;

interface IWMReaderCallback;

interface IWMMetadataEditor;
interface IWMMetadataEditor2;
interface IWMDRMEditor;

interface IWMHeaderInfo;

interface IWMProfile;
interface IWMProfileManager;
interface IWMStreamConfig;
interface IWMStreamList;
interface IWMMutualExclusion;
interface IWMBandwidthSharing;
interface IWMStreamPrioritization;
interface IWMPacketSize;
interface IWMPacketSize2;

interface IWMWriterAdvanced;
interface IWMWriterAdvanced2;
interface IWMWriterAdvanced3;
interface IWMWriterPreprocess;
interface IWMWriterSink;
interface IWMWriterFileSink;
interface IWMWriterNetworkSink;
interface IWMDRMWriter;
interface IWMDRMWriter2;
interface IWMDRMWriter3;

interface IWMReaderAdvanced;
interface IWMReaderAdvanced2;
interface IWMReaderAdvanced3;
interface IWMReaderAdvanced4;
interface IWMReaderAdvanced5;
interface IWMReaderAdvanced6;
interface IWMPlayerHook;
interface IWMReaderCallbackAdvanced;
interface IWMDRMReader;
interface IWMDRMReader2;
interface IWMDRMReader3;
interface IWMReaderPlaylistBurn;

interface IWMReaderAllocatorEx;

interface IWMReaderNetworkConfig;
interface IWMReaderNetworkConfig2;

interface IWMLicenseBackup;
interface IWMLicenseRestore;
interface IWMBackupRestoreProps;

interface IWMCodecInfo;
interface IWMCodecInfo2;
interface IWMCodecInfo3;

interface IWMSyncReader;

interface IWMLanguageList;

interface IWMImageInfo;
interface IWMAddressAccess;
interface IWMAddressAccess2;

interface IWMDeviceRegistration;
interface IWMRegisteredDevice;
interface IWMProximityDetection;
interface IWMDRMMessageParser;
interface IWMDRMTranscryptor;
interface IWMDRMTranscryptor2;
interface IWMDRMTranscryptionManager;
interface IWMLicenseRevocationAgent;


///////////////////////////////////////////////////////////////////////////////
//
// Attributes
//
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// These are the special case attributes that give information " )
cpp_quote( "// about the Windows Media file." )
cpp_quote( "//" )
cpp_quote( "static const DWORD g_dwWMSpecialAttributes = 20;" )
cpp_quote( "static const WCHAR g_wszWMDuration[] =L\"Duration\";" )
cpp_quote( "static const WCHAR g_wszWMBitrate[] =L\"Bitrate\";" )
cpp_quote( "static const WCHAR g_wszWMSeekable[] =L\"Seekable\";" )
cpp_quote( "static const WCHAR g_wszWMStridable[] =L\"Stridable\";" )
cpp_quote( "static const WCHAR g_wszWMBroadcast[] =L\"Broadcast\";" )
cpp_quote( "static const WCHAR g_wszWMProtected[] =L\"Is_Protected\";" )
cpp_quote( "static const WCHAR g_wszWMTrusted[] =L\"Is_Trusted\";" )
cpp_quote( "static const WCHAR g_wszWMSignature_Name[] =L\"Signature_Name\";" )
cpp_quote( "static const WCHAR g_wszWMHasAudio[] =L\"HasAudio\";" )
cpp_quote( "static const WCHAR g_wszWMHasImage[] =L\"HasImage\";" )
cpp_quote( "static const WCHAR g_wszWMHasScript[] =L\"HasScript\";" )
cpp_quote( "static const WCHAR g_wszWMHasVideo[] =L\"HasVideo\";" )
cpp_quote( "static const WCHAR g_wszWMCurrentBitrate[] =L\"CurrentBitrate\";" )
cpp_quote( "static const WCHAR g_wszWMOptimalBitrate[] =L\"OptimalBitrate\";" )
cpp_quote( "static const WCHAR g_wszWMHasAttachedImages[] =L\"HasAttachedImages\";" )
cpp_quote( "static const WCHAR g_wszWMSkipBackward[] =L\"Can_Skip_Backward\";" )
cpp_quote( "static const WCHAR g_wszWMSkipForward[] =L\"Can_Skip_Forward\";" )
cpp_quote( "static const WCHAR g_wszWMNumberOfFrames[] =L\"NumberOfFrames\";" )
cpp_quote( "static const WCHAR g_wszWMFileSize[] =L\"FileSize\";" )
cpp_quote( "static const WCHAR g_wszWMHasArbitraryDataStream[] =L\"HasArbitraryDataStream\";" )
cpp_quote( "static const WCHAR g_wszWMHasFileTransferStream[] =L\"HasFileTransferStream\";" )
cpp_quote( "static const WCHAR g_wszWMContainerFormat[] =L\"WM/ContainerFormat\";" )
cpp_quote( "" )
cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// The content description object supports 5 basic attributes." )
cpp_quote( "//" )
cpp_quote( "static const DWORD g_dwWMContentAttributes = 5;" )
cpp_quote( "static const WCHAR g_wszWMTitle[] =L\"Title\";" )
cpp_quote( "static const WCHAR g_wszWMAuthor[] =L\"Author\";" )
cpp_quote( "static const WCHAR g_wszWMDescription[] =L\"Description\";" )
cpp_quote( "static const WCHAR g_wszWMRating[] =L\"Rating\";" )
cpp_quote( "static const WCHAR g_wszWMCopyright[] =L\"Copyright\";" )
cpp_quote( "" )
cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// These attributes are used to configure and query DRM settings in the reader and writer." )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszWMUse_DRM[] = L\"Use_DRM\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_Flags[] = L\"DRM_Flags\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_Level[] = L\"DRM_Level\";" )
cpp_quote( "static const WCHAR g_wszWMUse_Advanced_DRM[] = L\"Use_Advanced_DRM\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_KeySeed[] = L\"DRM_KeySeed\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_KeyID[] = L\"DRM_KeyID\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_ContentID[] = L\"DRM_ContentID\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_SourceID[] = L\"DRM_SourceID\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_IndividualizedVersion[] = L\"DRM_IndividualizedVersion\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_LicenseAcqURL[] = L\"DRM_LicenseAcqURL\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_V1LicenseAcqURL[] = L\"DRM_V1LicenseAcqURL\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_HeaderSignPrivKey[] = L\"DRM_HeaderSignPrivKey\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_LASignaturePrivKey[] = L\"DRM_LASignaturePrivKey\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_LASignatureCert[] = L\"DRM_LASignatureCert\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_LASignatureLicSrvCert[] = L\"DRM_LASignatureLicSrvCert\";" )
cpp_quote( "static const WCHAR g_wszWMDRM_LASignatureRootCert[] = L\"DRM_LASignatureRootCert\";" )
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_wszWMAlbumTitle[] =L\"WM/AlbumTitle\";" )
cpp_quote( "static const WCHAR g_wszWMTrack[] =L\"WM/Track\";" )
cpp_quote( "static const WCHAR g_wszWMPromotionURL[] =L\"WM/PromotionURL\";" )
cpp_quote( "static const WCHAR g_wszWMAlbumCoverURL[] =L\"WM/AlbumCoverURL\";" )
cpp_quote( "static const WCHAR g_wszWMGenre[] =L\"WM/Genre\";" )
cpp_quote( "static const WCHAR g_wszWMYear[] =L\"WM/Year\";" )
cpp_quote( "static const WCHAR g_wszWMGenreID[] =L\"WM/GenreID\";" )
cpp_quote( "static const WCHAR g_wszWMMCDI[] =L\"WM/MCDI\";" )
cpp_quote( "static const WCHAR g_wszWMComposer[] =L\"WM/Composer\";" )
cpp_quote( "static const WCHAR g_wszWMLyrics[] =L\"WM/Lyrics\";" )
cpp_quote( "static const WCHAR g_wszWMTrackNumber[] =L\"WM/TrackNumber\";" )
cpp_quote( "static const WCHAR g_wszWMToolName[] =L\"WM/ToolName\";" )
cpp_quote( "static const WCHAR g_wszWMToolVersion[] =L\"WM/ToolVersion\";" )
cpp_quote( "static const WCHAR g_wszWMIsVBR[] =L\"IsVBR\";" )

//
// WM/AlbumArtist is a potentially different value than Author
//
cpp_quote( "static const WCHAR g_wszWMAlbumArtist[] =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_wszWMBannerImageType[] =L\"BannerImageType\";" )
cpp_quote( "static const WCHAR g_wszWMBannerImageData[] =L\"BannerImageData\";" )
cpp_quote( "static const WCHAR g_wszWMBannerImageURL[] =L\"BannerImageURL\";" )
cpp_quote( "static const WCHAR g_wszWMCopyrightURL[] =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_wszWMAspectRatioX[] =L\"AspectRatioX\";" )
cpp_quote( "static const WCHAR g_wszWMAspectRatioY[] =L\"AspectRatioY\";" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Optional attributes, used to give information " )
cpp_quote( "// about the overall streaming properties of VBR files." )
cpp_quote( "// This attribute takes the format:" )
cpp_quote( "//  WORD wReserved (must be 0)" )
cpp_quote( "//  WM_LEAKY_BUCKET_PAIR pair1" )
cpp_quote( "//  WM_LEAKY_BUCKET_PAIR pair2" )
cpp_quote( "//  ..." )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszASFLeakyBucketPairs[] =L\"ASFLeakyBucketPairs\";" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// The NSC file supports the following attributes." )
cpp_quote( "//" )
cpp_quote( "static const DWORD g_dwWMNSCAttributes = 5;" )
cpp_quote( "static const WCHAR g_wszWMNSCName[] =L\"NSC_Name\";" )
cpp_quote( "static const WCHAR g_wszWMNSCAddress[] =L\"NSC_Address\";" )
cpp_quote( "static const WCHAR g_wszWMNSCPhone[] =L\"NSC_Phone\";" )
cpp_quote( "static const WCHAR g_wszWMNSCEmail[] =L\"NSC_Email\";" )
cpp_quote( "static const WCHAR g_wszWMNSCDescription[] =L\"NSC_Description\";" )
cpp_quote( "" )

///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Attributes introduced in V9" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszWMWriter[] =L\"WM/Writer\";" )
cpp_quote( "static const WCHAR g_wszWMConductor[] =L\"WM/Conductor\";" )
cpp_quote( "static const WCHAR g_wszWMProducer[] =L\"WM/Producer\";" )
cpp_quote( "static const WCHAR g_wszWMDirector[] =L\"WM/Director\";" )
cpp_quote( "static const WCHAR g_wszWMContentGroupDescription[] =L\"WM/ContentGroupDescription\";" )
cpp_quote( "static const WCHAR g_wszWMSubTitle[] =L\"WM/SubTitle\";" )
cpp_quote( "static const WCHAR g_wszWMPartOfSet[] =L\"WM/PartOfSet\";" )
cpp_quote( "static const WCHAR g_wszWMProtectionType[] =L\"WM/ProtectionType\";" )
cpp_quote( "static const WCHAR g_wszWMVideoHeight[] =L\"WM/VideoHeight\";" )
cpp_quote( "static const WCHAR g_wszWMVideoWidth[] =L\"WM/VideoWidth\";" )
cpp_quote( "static const WCHAR g_wszWMVideoFrameRate[] =L\"WM/VideoFrameRate\";" )
cpp_quote( "static const WCHAR g_wszWMMediaClassPrimaryID[] =L\"WM/MediaClassPrimaryID\";" )
cpp_quote( "static const WCHAR g_wszWMMediaClassSecondaryID[] =L\"WM/MediaClassSecondaryID\";" )
cpp_quote( "static const WCHAR g_wszWMPeriod[] = L\"WM/Period\";" )
cpp_quote( "static const WCHAR g_wszWMCategory[] = L\"WM/Category\";" )
cpp_quote( "static const WCHAR g_wszWMPicture[] =L\"WM/Picture\";" )
cpp_quote( "static const WCHAR g_wszWMLyrics_Synchronised[] =L\"WM/Lyrics_Synchronised\";" )
cpp_quote( "static const WCHAR g_wszWMOriginalLyricist[] =L\"WM/OriginalLyricist\";" )
cpp_quote( "static const WCHAR g_wszWMOriginalArtist[] =L\"WM/OriginalArtist\";" )
cpp_quote( "static const WCHAR g_wszWMOriginalAlbumTitle[] =L\"WM/OriginalAlbumTitle\";" )
cpp_quote( "static const WCHAR g_wszWMOriginalReleaseYear[] =L\"WM/OriginalReleaseYear\";" )
cpp_quote( "static const WCHAR g_wszWMOriginalFilename[] =L\"WM/OriginalFilename\";" )
cpp_quote( "static const WCHAR g_wszWMPublisher[] =L\"WM/Publisher\";" )
cpp_quote( "static const WCHAR g_wszWMEncodedBy[] =L\"WM/EncodedBy\";" )
cpp_quote( "static const WCHAR g_wszWMEncodingSettings[] =L\"WM/EncodingSettings\";" )
cpp_quote( "static const WCHAR g_wszWMEncodingTime[] =L\"WM/EncodingTime\";" )
cpp_quote( "static const WCHAR g_wszWMAuthorURL[] =L\"WM/AuthorURL\";" )
cpp_quote( "static const WCHAR g_wszWMUserWebURL[] =L\"WM/UserWebURL\";" )
cpp_quote( "static const WCHAR g_wszWMAudioFileURL[] =L\"WM/AudioFileURL\";" )
cpp_quote( "static const WCHAR g_wszWMAudioSourceURL[] =L\"WM/AudioSourceURL\";" )
cpp_quote( "static const WCHAR g_wszWMLanguage[] =L\"WM/Language\";" )
cpp_quote( "static const WCHAR g_wszWMParentalRating[] =L\"WM/ParentalRating\";" )
cpp_quote( "static const WCHAR g_wszWMBeatsPerMinute[] =L\"WM/BeatsPerMinute\";" )
cpp_quote( "static const WCHAR g_wszWMInitialKey[] =L\"WM/InitialKey\";" )
cpp_quote( "static const WCHAR g_wszWMMood[] =L\"WM/Mood\";" )
cpp_quote( "static const WCHAR g_wszWMText[] =L\"WM/Text\";" )
cpp_quote( "static const WCHAR g_wszWMDVDID[] =L\"WM/DVDID\";" )
cpp_quote( "static const WCHAR g_wszWMWMContentID[] =L\"WM/WMContentID\";" )
cpp_quote( "static const WCHAR g_wszWMWMCollectionID[] =L\"WM/WMCollectionID\";" )
cpp_quote( "static const WCHAR g_wszWMWMCollectionGroupID[] =L\"WM/WMCollectionGroupID\";" )
cpp_quote( "static const WCHAR g_wszWMUniqueFileIdentifier[] =L\"WM/UniqueFileIdentifier\";" )
cpp_quote( "static const WCHAR g_wszWMModifiedBy[] =L\"WM/ModifiedBy\";" )
cpp_quote( "static const WCHAR g_wszWMRadioStationName[] =L\"WM/RadioStationName\";" )
cpp_quote( "static const WCHAR g_wszWMRadioStationOwner[] =L\"WM/RadioStationOwner\";" )
cpp_quote( "static const WCHAR g_wszWMPlaylistDelay[] =L\"WM/PlaylistDelay\";" )
cpp_quote( "static const WCHAR g_wszWMCodec[] =L\"WM/Codec\";" )
cpp_quote( "static const WCHAR g_wszWMDRM[] =L\"WM/DRM\";" )
cpp_quote( "static const WCHAR g_wszWMISRC[] =L\"WM/ISRC\";" )
cpp_quote( "static const WCHAR g_wszWMProvider[] =L\"WM/Provider\";" )
cpp_quote( "static const WCHAR g_wszWMProviderRating[] =L\"WM/ProviderRating\";" )
cpp_quote( "static const WCHAR g_wszWMProviderStyle[] =L\"WM/ProviderStyle\";" )
cpp_quote( "static const WCHAR g_wszWMContentDistributor[] =L\"WM/ContentDistributor\";" )
cpp_quote( "static const WCHAR g_wszWMSubscriptionContentID[] =L\"WM/SubscriptionContentID\";" )
cpp_quote( "static const WCHAR g_wszWMWMADRCPeakReference[] =L\"WM/WMADRCPeakReference\";" )
cpp_quote( "static const WCHAR g_wszWMWMADRCPeakTarget[] =L\"WM/WMADRCPeakTarget\";" )
cpp_quote( "static const WCHAR g_wszWMWMADRCAverageReference[] =L\"WM/WMADRCAverageReference\";" )
cpp_quote( "static const WCHAR g_wszWMWMADRCAverageTarget[] =L\"WM/WMADRCAverageTarget\";" )

///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Attributes introduced in V10" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszWMStreamTypeInfo[] = L\"WM/StreamTypeInfo\";" )
cpp_quote( "static const WCHAR g_wszWMPeakBitrate[] = L\"WM/PeakBitrate\";" )
cpp_quote( "static const WCHAR g_wszWMASFPacketCount[] = L\"WM/ASFPacketCount\";" )
cpp_quote( "static const WCHAR g_wszWMASFSecurityObjectsSize[] = L\"WM/ASFSecurityObjectsSize\";" )
cpp_quote( "static const WCHAR g_wszWMSharedUserRating[] = L\"WM/SharedUserRating\";" )
cpp_quote( "static const WCHAR g_wszWMSubTitleDescription[] = L\"WM/SubTitleDescription\";" )
cpp_quote( "static const WCHAR g_wszWMMediaCredits[] = L\"WM/MediaCredits\";" )
cpp_quote( "static const WCHAR g_wszWMParentalRatingReason[] = L\"WM/ParentalRatingReason\";" )
cpp_quote( "static const WCHAR g_wszWMOriginalReleaseTime[] = L\"WM/OriginalReleaseTime\";" )
cpp_quote( "static const WCHAR g_wszWMMediaStationCallSign[] = L\"WM/MediaStationCallSign\";" )
cpp_quote( "static const WCHAR g_wszWMMediaStationName[] = L\"WM/MediaStationName\";" )
cpp_quote( "static const WCHAR g_wszWMMediaNetworkAffiliation[] = L\"WM/MediaNetworkAffiliation\";" )
cpp_quote( "static const WCHAR g_wszWMMediaOriginalChannel[] = L\"WM/MediaOriginalChannel\";" )
cpp_quote( "static const WCHAR g_wszWMMediaOriginalBroadcastDateTime[] = L\"WM/MediaOriginalBroadcastDateTime\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsStereo[] = L\"WM/MediaIsStereo\";" )
cpp_quote( "static const WCHAR g_wszWMVideoClosedCaptioning[] = L\"WM/VideoClosedCaptioning\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsRepeat[] = L\"WM/MediaIsRepeat\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsLive[] = L\"WM/MediaIsLive\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsTape[] = L\"WM/MediaIsTape\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsDelay[] = L\"WM/MediaIsDelay\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsSubtitled[] = L\"WM/MediaIsSubtitled\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsPremiere[] = L\"WM/MediaIsPremiere\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsFinale[] = L\"WM/MediaIsFinale\";" )
cpp_quote( "static const WCHAR g_wszWMMediaIsSAP[] = L\"WM/MediaIsSAP\";" )
cpp_quote( "static const WCHAR g_wszWMProviderCopyright[] = L\"WM/ProviderCopyright\";" )

///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Attributes introduced in V11" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszWMISAN[] = L\"WM/ISAN\";" )
cpp_quote( "static const WCHAR g_wszWMADID[] = L\"WM/ADID\";" )
cpp_quote( "static const WCHAR g_wszWMWMShadowFileSourceFileType[] = L\"WM/WMShadowFileSourceFileType\";" )
cpp_quote( "static const WCHAR g_wszWMWMShadowFileSourceDRMType[] = L\"WM/WMShadowFileSourceDRMType\";" )
cpp_quote( "static const WCHAR g_wszWMWMCPDistributor[] =L\"WM/WMCPDistributor\";" )
cpp_quote( "static const WCHAR g_wszWMWMCPDistributorID[] =L\"WM/WMCPDistributorID\";" )

///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// These are setting names for use in Get/SetOutputSetting" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszEarlyDataDelivery[] =L\"EarlyDataDelivery\";" )
cpp_quote( "static const WCHAR g_wszJustInTimeDecode[] =L\"JustInTimeDecode\";" )
cpp_quote( "static const WCHAR g_wszSingleOutputBuffer[] =L\"SingleOutputBuffer\";" )
cpp_quote( "static const WCHAR g_wszSoftwareScaling[] =L\"SoftwareScaling\";" )
cpp_quote( "static const WCHAR g_wszDeliverOnReceive[] =L\"DeliverOnReceive\";" )
cpp_quote( "static const WCHAR g_wszScrambledAudio[] =L\"ScrambledAudio\";" )
cpp_quote( "static const WCHAR g_wszDedicatedDeliveryThread[] =L\"DedicatedDeliveryThread\";" )
cpp_quote( "static const WCHAR g_wszEnableDiscreteOutput[] = L\"EnableDiscreteOutput\";" )
cpp_quote( "static const WCHAR g_wszSpeakerConfig[] = L\"SpeakerConfig\";" )
cpp_quote( "static const WCHAR g_wszDynamicRangeControl[] = L\"DynamicRangeControl\";" )
cpp_quote( "static const WCHAR g_wszAllowInterlacedOutput[] = L\"AllowInterlacedOutput\";" )
cpp_quote( "static const WCHAR g_wszVideoSampleDurations[] =L\"VideoSampleDurations\";" )
cpp_quote( "static const WCHAR g_wszStreamLanguage[] =L\"StreamLanguage\";" )
cpp_quote( "static const WCHAR g_wszEnableWMAProSPDIFOutput[] = L\"EnableWMAProSPDIFOutput\";" )
cpp_quote( "" )

///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// These are setting names for use in Get/SetInputSetting" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszDeinterlaceMode[] =L\"DeinterlaceMode\";" )
cpp_quote( "static const WCHAR g_wszInitialPatternForInverseTelecine[] =L\"InitialPatternForInverseTelecine\";" )
cpp_quote( "static const WCHAR g_wszJPEGCompressionQuality[] =L\"JPEGCompressionQuality\";" )
cpp_quote( "static const WCHAR g_wszWatermarkCLSID[] =L\"WatermarkCLSID\";" )
cpp_quote( "static const WCHAR g_wszWatermarkConfig[] =L\"WatermarkConfig\";" )
cpp_quote( "static const WCHAR g_wszInterlacedCoding[] =L\"InterlacedCoding\";" )
cpp_quote( "static const WCHAR g_wszFixedFrameRate[] =L\"FixedFrameRate\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// All known IWMPropertyVault property names" )
cpp_quote( "//" )
cpp_quote( "// g_wszOriginalSourceFormatTag is obsolete and has been superceded by g_wszOriginalWaveFormat" )
cpp_quote( "static const WCHAR g_wszOriginalSourceFormatTag[] =L\"_SOURCEFORMATTAG\";" )
cpp_quote( "static const WCHAR g_wszOriginalWaveFormat[] =L\"_ORIGINALWAVEFORMAT\";" )
cpp_quote( "static const WCHAR g_wszEDL[] =L\"_EDL\";" )
cpp_quote( "static const WCHAR g_wszComplexity[] =L\"_COMPLEXITYEX\";" )
cpp_quote( "static const WCHAR g_wszDecoderComplexityRequested[] =L\"_DECODERCOMPLEXITYPROFILE\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// All known IWMIStreamProps property names" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszReloadIndexOnSeek[] =L\"ReloadIndexOnSeek\";" )
cpp_quote( "static const WCHAR g_wszStreamNumIndexObjects[] =L\"StreamNumIndexObjects\";" )
cpp_quote( "static const WCHAR g_wszFailSeekOnError[] =L\"FailSeekOnError\";" )
cpp_quote( "static const WCHAR g_wszPermitSeeksBeyondEndOfStream[] =L\"PermitSeeksBeyondEndOfStream\";" )
cpp_quote( "static const WCHAR g_wszUsePacketAtSeekPoint[] =L\"UsePacketAtSeekPoint\";" )
cpp_quote( "static const WCHAR g_wszSourceBufferTime[] =L\"SourceBufferTime\";" )
cpp_quote( "static const WCHAR g_wszSourceMaxBytesAtOnce[] =L\"SourceMaxBytesAtOnce\";" )
cpp_quote( "" )

///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// VBR encoding settings" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszVBREnabled[] =L\"_VBRENABLED\";" )
cpp_quote( "static const WCHAR g_wszVBRQuality[] =L\"_VBRQUALITY\";" )
cpp_quote( "static const WCHAR g_wszVBRBitrateMax[] =L\"_RMAX\";" )
cpp_quote( "static const WCHAR g_wszVBRBufferWindowMax[] =L\"_BMAX\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// VBR Video settings" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszVBRPeak[] = L\"VBR Peak\";" )
cpp_quote( "static const WCHAR g_wszBufferAverage[] = L\"Buffer Average\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Codec encoding complexity settings" )
cpp_quote( "//" )
cpp_quote( "// g_wszComplexity should be used to set desired encoding complexity on the" )
cpp_quote( "// stream's IWMPropertyVault (see above for definition) " )
cpp_quote( "// The below settings can be queried from IWMCodecInfo3::GetCodecProp()" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszComplexityMax[] =L\"_COMPLEXITYEXMAX\";" )
cpp_quote( "static const WCHAR g_wszComplexityOffline[] =L\"_COMPLEXITYEXOFFLINE\";" )
cpp_quote( "static const WCHAR g_wszComplexityLive[] =L\"_COMPLEXITYEXLIVE\";" )
cpp_quote( "static const WCHAR g_wszIsVBRSupported[] =L\"_ISVBRSUPPORTED\";" )


cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Codec enumeration settings" )
cpp_quote( "//" )
cpp_quote( "// g_wszVBREnabled can be used as a codec enumeration setting (see above for definition)" )
cpp_quote( "static const WCHAR g_wszNumPasses[] = L\"_PASSESUSED\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// These are WMA Voice V9 attribute names and values" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszMusicSpeechClassMode[] = L\"MusicSpeechClassMode\";" )
cpp_quote( "static const WCHAR g_wszMusicClassMode[] = L\"MusicClassMode\";" )
cpp_quote( "static const WCHAR g_wszSpeechClassMode[] = L\"SpeechClassMode\";" )
cpp_quote( "static const WCHAR g_wszMixedClassMode[] = L\"MixedClassMode\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// The WMA Voice V9 supports the following format property." )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszSpeechCaps[] = L\"SpeechFormatCap\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Multi-channel WMA properties" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszPeakValue[] = L\"PeakValue\";" )
cpp_quote( "static const WCHAR g_wszAverageLevel[] = L\"AverageLevel\";" )
cpp_quote( "static const WCHAR g_wszFold6To2Channels3[] = L\"Fold6To2Channels3\";" )
cpp_quote( "static const WCHAR g_wszFoldToChannelsTemplate[] = L\"Fold%luTo%luChannels%lu\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Complexity profile description strings" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszDeviceConformanceTemplate[] = L\"DeviceConformanceTemplate\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Frame interpolation on video decode" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszEnableFrameInterpolation[] =L\"EnableFrameInterpolation\";" )
cpp_quote( "" )

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Needs previous sample for Delta frame on video decode" )
cpp_quote( "//" )
cpp_quote( "static const WCHAR g_wszNeedsPreviousSample[] =L\"NeedsPreviousSample\";" )
cpp_quote( "" )

///////////////////////////////////////////////////////////////////////////////
//
// Enumerations and flags used by the SDK.
//
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Flags that can be passed into the Start method of IWMReader" )
cpp_quote( "//" )
cpp_quote( "#define WM_START_CURRENTPOSITION     ( ( QWORD )-1 )" )
cpp_quote( "" )

//
// Flag to force overwrite of existing license backup
//
cpp_quote( "#define WM_BACKUP_OVERWRITE    ((DWORD) 0x00000001)" )
cpp_quote( "#define WM_RESTORE_INDIVIDUALIZE    ((DWORD) 0x00000002)" )

//
// Wave format ex type
//
cpp_quote( "#define WAVE_FORMAT_DRM            0x0009" )

//
// Define a type that can allow changing the declarations of interfaces such that they are const correct
// but do not break compilation of consumers.
//
typedef LPCWSTR LPCWSTR_WMSDK_TYPE_SAFE;

cpp_quote( "#ifdef WMSDK_TYPE_SAFE" )
cpp_quote( "#define LPCWSTR_WMSDK_TYPE_SAFE LPCWSTR" )
cpp_quote( "#else" )
cpp_quote( "#define LPCWSTR_WMSDK_TYPE_SAFE LPWSTR" )
cpp_quote( "#endif" )


//
// Sample type ids for Web Streams
//

enum
{
    WEBSTREAM_SAMPLE_TYPE_FILE           = 0x1,
    WEBSTREAM_SAMPLE_TYPE_RENDER         = 0x2
};

//
// The flags that can be set on a sample (input or output).
//
enum
{
    WM_SF_CLEANPOINT = 0x1,
    WM_SF_DISCONTINUITY = 0x2,
    WM_SF_DATALOSS = 0x4,
};

//
// These flags might be set for a call to the IWMReaderAllocatorEx methods.
//
enum
{
    WM_SFEX_NOTASYNCPOINT = 0x2,
    WM_SFEX_DATALOSS = 0x4,
};

//
// Status messages that the reader and index objects can
// pass in the OnStatus call.
//
typedef enum WMT_STATUS
{
    WMT_ERROR                       =  0,
    WMT_OPENED                      =  1,
    WMT_BUFFERING_START             =  2,
    WMT_BUFFERING_STOP              =  3,
    WMT_EOF                         =  4,
    WMT_END_OF_FILE                 =  4,
    WMT_END_OF_SEGMENT              =  5,
    WMT_END_OF_STREAMING            =  6,
    WMT_LOCATING                    =  7,
    WMT_CONNECTING                  =  8,
    WMT_NO_RIGHTS                   =  9,
    WMT_MISSING_CODEC               = 10,
    WMT_STARTED                     = 11,
    WMT_STOPPED                     = 12,
    WMT_CLOSED                      = 13,
    WMT_STRIDING                    = 14,
    WMT_TIMER                       = 15,
    WMT_INDEX_PROGRESS              = 16,
    WMT_SAVEAS_START                = 17,
    WMT_SAVEAS_STOP                 = 18,
    WMT_NEW_SOURCEFLAGS             = 19,
    WMT_NEW_METADATA                = 20,
    WMT_BACKUPRESTORE_BEGIN         = 21,
    WMT_SOURCE_SWITCH               = 22,
    WMT_ACQUIRE_LICENSE             = 23,
    WMT_INDIVIDUALIZE               = 24,
    WMT_NEEDS_INDIVIDUALIZATION     = 25,
    WMT_NO_RIGHTS_EX                = 26,
    WMT_BACKUPRESTORE_END           = 27,
    WMT_BACKUPRESTORE_CONNECTING    = 28,
    WMT_BACKUPRESTORE_DISCONNECTING = 29,
    WMT_ERROR_WITHURL               = 30,
    WMT_RESTRICTED_LICENSE          = 31,
    WMT_CLIENT_CONNECT              = 32,
    WMT_CLIENT_DISCONNECT           = 33,
    WMT_NATIVE_OUTPUT_PROPS_CHANGED = 34,
    WMT_RECONNECT_START             = 35,
    WMT_RECONNECT_END               = 36,
    WMT_CLIENT_CONNECT_EX           = 37,
    WMT_CLIENT_DISCONNECT_EX        = 38,
    WMT_SET_FEC_SPAN                = 39,
    WMT_PREROLL_READY               = 40,
    WMT_PREROLL_COMPLETE            = 41,
    WMT_CLIENT_PROPERTIES           = 42,
    WMT_LICENSEURL_SIGNATURE_STATE  = 43,
    WMT_INIT_PLAYLIST_BURN          = 44,
    WMT_TRANSCRYPTOR_INIT           = 45,
    WMT_TRANSCRYPTOR_SEEKED         = 46,
    WMT_TRANSCRYPTOR_READ           = 47,
    WMT_TRANSCRYPTOR_CLOSED         = 48,
    WMT_PROXIMITY_RESULT            = 49,
    WMT_PROXIMITY_COMPLETED         = 50,
    WMT_CONTENT_ENABLER             = 51
} WMT_STATUS;

//
// Stream selection statuses (stati?).
//
typedef enum WMT_STREAM_SELECTION
{
    WMT_OFF               = 0,
    WMT_CLEANPOINT_ONLY   = 1,
    WMT_ON                = 2,
} WMT_STREAM_SELECTION;

//
// Image types (used with CBO)
//
typedef enum WMT_IMAGE_TYPE
{
    WMT_IT_NONE      = 0,
    WMT_IT_BITMAP    = 1,
    WMT_IT_JPEG      = 2,
    WMT_IT_GIF       = 3
} WMT_IMAGE_TYPE;

//
// Attribute datatypes.
//
typedef enum WMT_ATTR_DATATYPE
{

    WMT_TYPE_DWORD      = 0,
    WMT_TYPE_STRING     = 1,
    WMT_TYPE_BINARY     = 2,
    WMT_TYPE_BOOL       = 3,
    WMT_TYPE_QWORD      = 4,
    WMT_TYPE_WORD       = 5,
    WMT_TYPE_GUID       = 6,

} WMT_ATTR_DATATYPE;

//
// Types of images that can be stored in the header of a Windows Media File.
//
typedef enum WMT_ATTR_IMAGETYPE
{
    WMT_IMAGETYPE_BITMAP = 1,
    WMT_IMAGETYPE_JPEG = 2,
    WMT_IMAGETYPE_GIF = 3,
} WMT_ATTR_IMAGETYPE;

//
// Windows Media versions.
//
typedef enum WMT_VERSION
{
    WMT_VER_4_0 = 0x00040000,
    WMT_VER_7_0 = 0x00070000,
    WMT_VER_8_0 = 0x00080000,
    WMT_VER_9_0 = 0x00090000,
} WMT_VERSION;

//
// Storage formats.  These are the values returned when querying
// the WM/ContainerFormat attribute (g_wszWMContainerFormat).
//
typedef enum tagWMT_STORAGE_FORMAT
{
    WMT_Storage_Format_MP3,
    WMT_Storage_Format_V1
} WMT_STORAGE_FORMAT;

typedef enum tagWMT_DRMLA_TRUST
{
    WMT_DRMLA_UNTRUSTED = 0,
    WMT_DRMLA_TRUSTED,
    WMT_DRMLA_TAMPERED
} WMT_DRMLA_TRUST;

//
// Type of data communication protocol (reliable or unreliable)
//
typedef enum tagWMT_TRANSPORT_TYPE
{
   WMT_Transport_Type_Unreliable,
   WMT_Transport_Type_Reliable
} WMT_TRANSPORT_TYPE;

//
// Protocols that the network sink supports.
//
typedef enum WMT_NET_PROTOCOL
{
    WMT_PROTOCOL_HTTP    = 0,
} WMT_NET_PROTOCOL;


//
// The reader supports a number of different types of playback, each with
// slightly different characteristics.
//
typedef enum WMT_PLAY_MODE
{
    WMT_PLAY_MODE_AUTOSELECT    = 0,
    WMT_PLAY_MODE_LOCAL         = 1,
    WMT_PLAY_MODE_DOWNLOAD      = 2,
    WMT_PLAY_MODE_STREAMING     = 3,
} WMT_PLAY_MODE;

//
// Network Proxy settings for the reader
//
typedef enum WMT_PROXY_SETTINGS
{
    WMT_PROXY_SETTING_NONE      = 0,
    WMT_PROXY_SETTING_MANUAL    = 1,
    WMT_PROXY_SETTING_AUTO      = 2,
    WMT_PROXY_SETTING_BROWSER   = 3,        // Only valid for HTTP
    WMT_PROXY_SETTING_MAX
} WMT_PROXY_SETTINGS;


typedef enum WMT_CODEC_INFO_TYPE
{
    WMT_CODECINFO_AUDIO         = 0,            // codec info is a word = wFormatTag
    WMT_CODECINFO_VIDEO         = 1,            // codec info is a dword = biCompression
    WMT_CODECINFO_UNKNOWN       = 0xFFFFFFFF,   // codec info is undefined
} WMT_CODEC_INFO_TYPE;

//
// These values can be passed in when setting the DeinterlaceMode
// setting on the writer
//
enum
{
    WM_DM_NOTINTERLACED                  = 0,
    WM_DM_DEINTERLACE_NORMAL             = 1,
    WM_DM_DEINTERLACE_HALFSIZE           = 2,
    WM_DM_DEINTERLACE_HALFSIZEDOUBLERATE = 3,
    WM_DM_DEINTERLACE_INVERSETELECINE    = 4,
    WM_DM_DEINTERLACE_VERTICALHALFSIZEDOUBLERATE = 5,
};

//
// These values can be passed to further configure the inverse
// telecine process
//
enum
{
    WM_DM_IT_DISABLE_COHERENT_MODE       = 0,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_AA_TOP   = 1,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_BB_TOP   = 2,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_BC_TOP   = 3,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_CD_TOP   = 4,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_DD_TOP   = 5,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_AA_BOTTOM   = 6,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_BB_BOTTOM   = 7,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_BC_BOTTOM   = 8,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_CD_BOTTOM   = 9,
    WM_DM_IT_FIRST_FRAME_IN_CLIP_IS_DD_BOTTOM   = 10
};

//
// Frame level access data structures
//
typedef enum tagWMT_OFFSET_FORMAT
{
    WMT_OFFSET_FORMAT_100NS,
    WMT_OFFSET_FORMAT_FRAME_NUMBERS,
    WMT_OFFSET_FORMAT_PLAYLIST_OFFSET,
    WMT_OFFSET_FORMAT_TIMECODE,
    WMT_OFFSET_FORMAT_100NS_APPROXIMATE
}   WMT_OFFSET_FORMAT;

//
// Indexer type and index type
//
typedef enum tagWMT_INDEXER_TYPE
{
    WMT_IT_PRESENTATION_TIME,
    WMT_IT_FRAME_NUMBERS,
    WMT_IT_TIMECODE
}   WMT_INDEXER_TYPE;

typedef enum tagWMT_INDEX_TYPE
{
    WMT_IT_NEAREST_DATA_UNIT = 1,
    WMT_IT_NEAREST_OBJECT,
    WMT_IT_NEAREST_CLEAN_POINT
}   WMT_INDEX_TYPE;

//
// The types of input accepted by the file sink
//
typedef enum tagWMT_FILESINK_MODE
{
    WMT_FM_SINGLE_BUFFERS       = 0x00000001,
    WMT_FM_FILESINK_DATA_UNITS  = 0x00000002,
    WMT_FM_FILESINK_UNBUFFERED  = 0x00000004
}   WMT_FILESINK_MODE;

//
// WMA Voice V9 supports several type of compression,
// profile settting are mapped to these constants
//
typedef enum tagWMT_MUSICSPEECH_CLASS_MODE
{
    WMT_MS_CLASS_MUSIC    = 0,
    WMT_MS_CLASS_SPEECH   = 1,
    WMT_MS_CLASS_MIXED    = 2
}   WMT_MUSICSPEECH_CLASS_MODE;

typedef enum tagWMT_WATERMARK_ENTRY_TYPE
{
    WMT_WMETYPE_AUDIO = 1,
    WMT_WMETYPE_VIDEO = 2
} WMT_WATERMARK_ENTRY_TYPE;

//
// Dynamic Range Control values for playback
//
enum
{
    WM_PLAYBACK_DRC_HIGH    = 0,
    WM_PLAYBACK_DRC_MEDIUM,
    WM_PLAYBACK_DRC_LOW
};

//
// Timecode frame rates.  These are meant to be used as the
// values for the stream-based frame rate metadata attribute.
// See the WM Format SDK docs for more details.
//
enum
{
    WMT_TIMECODE_FRAMERATE_30      = 0,
    WMT_TIMECODE_FRAMERATE_30DROP,
    WMT_TIMECODE_FRAMERATE_25,
    WMT_TIMECODE_FRAMERATE_24
};

//
// Flags that can be specified in IWMCredentialCallback::AcquireCredentials()
//
typedef enum WMT_CREDENTIAL_FLAGS
{
    WMT_CREDENTIAL_SAVE                 = 0x00000001,       // Save the credentials in a persistent manner
    WMT_CREDENTIAL_DONT_CACHE           = 0x00000002,       // Don't cache the credentials in memory
    WMT_CREDENTIAL_CLEAR_TEXT           = 0x00000004,       // Credentials will be sent in clear text
    WMT_CREDENTIAL_PROXY                = 0x00000008,       // Credentials are for a proxy server
    WMT_CREDENTIAL_ENCRYPT              = 0x00000010        // Encryption supported/used (in request/response, respectively)
} WMT_CREDENTIAL_FLAGS;

typedef enum WM_AETYPE
{
    WM_AETYPE_INCLUDE   = 'i',
    WM_AETYPE_EXCLUDE   = 'e'

} WM_AETYPE;

///////////////////////////////////////////////////////////////////////////////
//
// Structures used by the SDK.
//
///////////////////////////////////////////////////////////////////////////////

#pragma pack(push)
#pragma pack(2)

//
// Stream prioritization struct
//
typedef struct _WMStreamPrioritizationRecord
{
    WORD wStreamNumber;
    BOOL fMandatory;
} WM_STREAM_PRIORITY_RECORD;

#pragma pack(pop)

//
// Writer Statistics struct
//
typedef struct _WMWriterStatistics
{
    QWORD qwSampleCount;
    QWORD qwByteCount;

    QWORD qwDroppedSampleCount;
    QWORD qwDroppedByteCount;

    DWORD dwCurrentBitrate;
    DWORD dwAverageBitrate;
    DWORD dwExpectedBitrate;

    //
    // Sample rates are given as 1000 * (samples / second).
    //
    DWORD dwCurrentSampleRate;
    DWORD dwAverageSampleRate;
    DWORD dwExpectedSampleRate;
} WM_WRITER_STATISTICS;

//
// Extended Writer Statistics
//
typedef struct _WMWriterStatisticsEx
{
    //
    // Bitrate that includes overhead
    //
    DWORD dwBitratePlusOverhead;

    //
    // Sample rates are given as 1000 * (samples / second)
    //
    DWORD dwCurrentSampleDropRateInQueue;
    DWORD dwCurrentSampleDropRateInCodec;
    DWORD dwCurrentSampleDropRateInMultiplexer;

    //
    // Cumulative sample drops
    //
    DWORD dwTotalSampleDropsInQueue;
    DWORD dwTotalSampleDropsInCodec;
    DWORD dwTotalSampleDropsInMultiplexer;

} WM_WRITER_STATISTICS_EX;

//
// Reader Statistics struct
//
typedef struct _WMReaderStatistics
{
    DWORD cbSize;
    DWORD dwBandwidth;
    DWORD cPacketsReceived;
    DWORD cPacketsRecovered;
    DWORD cPacketsLost;
    WORD  wQuality;
} WM_READER_STATISTICS;


//
// Reader Client Info struct
//
typedef struct _WMReaderClientInfo
{
    DWORD  cbSize;
    WCHAR  *wszLang;              // 2-3 letter language code
    WCHAR  *wszBrowserUserAgent;  // Embedded browser's user-agent string
    WCHAR  *wszBrowserWebPage;    // The web page that contains the plugin
    QWORD  qwReserved;            // Reserved
    LPARAM *pReserved;            // Reserved
    WCHAR  *wszHostExe;           // iexplore.exe, netscape.exe dshow.exe, etc
    QWORD  qwHostVersion;         // Version of the host application e.g.:4.70.12.15
    WCHAR  *wszPlayerUserAgent;   // String identifying the player application, e.g. WMPlayer/9.0.0.0
} WM_READER_CLIENTINFO;


//
// This structure is returned with the WMT_CLIENT_CONNECT and
// WMT_CLIENT_DISCONNECT status notifications.  It is also used
// by IWMClientConnections.
//
typedef struct _WMClientProperties
{
    DWORD   dwIPAddress;
    DWORD   dwPort;
} WM_CLIENT_PROPERTIES;


//
// This structure is returned with the WMT_CLIENT_CONNECT_EX, WMT_CLIENT_DISCONNECT_EX
// and WMT_CLIENT_PROPERTIES status notifications.
//
typedef struct _WMClientPropertiesEx
{
    DWORD    cbSize;                // size of structure
    LPCWSTR  pwszIPAddress;         // IP address in dot notation
    LPCWSTR  pwszPort;              // Client's port number
    LPCWSTR  pwszDNSName;           // DNS name of client, if known
} WM_CLIENT_PROPERTIES_EX;

//
// Inclusive port number range.
// Used by IWMReaderNetworkConfig.
//
typedef struct _WMPortNumberRange
{
    WORD   wPortBegin;
    WORD   wPortEnd;
} WM_PORT_NUMBER_RANGE;

//
// For passing data units to the file sink
//
typedef struct _WMT_BUFFER_SEGMENT
{
    INSSBuffer  *pBuffer;
    DWORD       cbOffset;
    DWORD       cbLength;
} WMT_BUFFER_SEGMENT;

typedef struct _WMT_PAYLOAD_FRAGMENT
{
    DWORD               dwPayloadIndex;
    WMT_BUFFER_SEGMENT  segmentData;
} WMT_PAYLOAD_FRAGMENT;


typedef struct _WMT_FILESINK_DATA_UNIT
{
    WMT_BUFFER_SEGMENT      packetHeaderBuffer;

    DWORD                   cPayloads;
    WMT_BUFFER_SEGMENT      *pPayloadHeaderBuffers;

    DWORD                   cPayloadDataFragments;
    WMT_PAYLOAD_FRAGMENT    *pPayloadDataFragments;

} WMT_FILESINK_DATA_UNIT;

typedef struct _WMT_WEBSTREAM_FORMAT
{
    WORD                    cbSize;                    // Set to sizeof( WMT_WEBSTREAM_FORMAT )
    WORD                    cbSampleHeaderFixedData;   // Length of the fixed part of the sample header should be
                                                       // set to sizeof( WMT_WEBSTREAM_SAMPLE_HEADER )
    WORD                    wVersion;
    WORD                    wReserved;                 // Reserved. Should be set to 0.
} WMT_WEBSTREAM_FORMAT;

typedef struct _WMT_WEBSTREAM_SAMPLE_HEADER
{
    WORD                    cbLength;                  // Length of this header including string data
                                                       // should be set to sizeof( WMT_WEBSTREAM_SAMPLE_HEADER ) +
                                                       // wcslen( wszURL ) * sizeof( WCHAR )
    WORD                    wPart;                     // Current part. From 0 to cTotalParts - 1
    WORD                    cTotalParts;               // Total number of parts for this file must be at least 1.
    WORD                    wSampleType;               // Sample type. Should be set to
                                                       //     WEBSTREAM_SAMPLE_TYPE_FILE = 0x0001 or
                                                       //     WEBSTREAM_SAMPLE_TYPE_RENDER = 0x0002
    WCHAR                   wszURL[1];                 // Variable length string data containing file url
} WMT_WEBSTREAM_SAMPLE_HEADER;


typedef struct _WMAddressAccessEntry
{
    DWORD       dwIPAddress;
    DWORD       dwMask;
} WM_ADDRESS_ACCESSENTRY;


///////////////////////////////////////////////////////////////////////////////
//
// Structures for complex metadata attributes
//
///////////////////////////////////////////////////////////////////////////////

#pragma pack(push)
#pragma pack(1)

typedef struct _WMPicture
{
    LPWSTR pwszMIMEType;
    BYTE bPictureType;
    LPWSTR pwszDescription;
    DWORD dwDataLen;
    BYTE *pbData;
} WM_PICTURE;

typedef struct _WMSynchronisedLyrics
{
    BYTE bTimeStampFormat;
    BYTE bContentType;
    LPWSTR pwszContentDescriptor;
    DWORD dwLyricsLen;
    BYTE *pbLyrics;
} WM_SYNCHRONISED_LYRICS;

typedef struct _WMUserWebURL
{
    LPWSTR pwszDescription;
    LPWSTR pwszURL;
} WM_USER_WEB_URL;

typedef struct _WMUserText
{
    LPWSTR pwszDescription;
    LPWSTR pwszText;
} WM_USER_TEXT;

typedef struct _WMLeakyBucketPair
{
    DWORD dwBitrate;
    DWORD msBufferWindow;

} WM_LEAKY_BUCKET_PAIR;

typedef struct _WMStreamTypeInfo
{
    GUID guidMajorType;
    DWORD cbFormat;
} WM_STREAM_TYPE_INFO;

#pragma pack(pop)

///////////////////////////////////////////////////////////////////////////////
//
// Structure needed for using GetDRMProperty.
//
///////////////////////////////////////////////////////////////////////////////
typedef struct  _WM_LICENSE_STATE_DATA
{
    DWORD   dwSize;         // Size of the entire structure.
    DWORD   dwNumStates;    // Number of state data passed back in array of structure below
    DRM_LICENSE_STATE_DATA stateData[1];
} WM_LICENSE_STATE_DATA;

///////////////////////////////////////////////////////////////////////////////
// Watermark entry
///////////////////////////////////////////////////////////////////////////////
typedef struct __WMT_WATERMARK_ENTRY
{
    WMT_WATERMARK_ENTRY_TYPE wmetType;
    CLSID                    clsid;
    UINT                     cbDisplayName;
    LPWSTR                   pwszDisplayName;
} WMT_WATERMARK_ENTRY;

///////////////////////////////////////////////////////////////////////////////
// VideoImage structs
///////////////////////////////////////////////////////////////////////////////

//
// dwControlFlags
//
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_INPUT_FRAME      1 // sample has input frame ")
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_OUTPUT_FRAME     2 // sample produces output frame ")
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_USES_CURRENT_INPUT_FRAME  4 ")
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_USES_PREVIOUS_INPUT_FRAME 8 ")

//
// dwInputFlags
//
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_MOTION       1 // acef used (includes resizing) ")
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_ROTATION     2 // bd also used (not valid without acef) ")
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_BLENDING     4 // BlendCoef1 used ")
cpp_quote( "#define WMT_VIDEOIMAGE_SAMPLE_ADV_BLENDING 8 // BlendCoef2 also used (not valid without BlendCoef1) ")

cpp_quote( "#define WMT_VIDEOIMAGE_INTEGER_DENOMINATOR 65536L ")

cpp_quote( "#define WMT_VIDEOIMAGE_MAGIC_NUMBER 0x1d4a45f2 ")
cpp_quote( "#define WMT_VIDEOIMAGE_MAGIC_NUMBER_2 0x1d4a45f3 ")

typedef struct __WMT_VIDEOIMAGE_SAMPLE {
    DWORD dwMagic;
    ULONG cbStruct; // size of structure; incudes dwMagic and cbStruct
    DWORD dwControlFlags;

    //
    // most recent input frame
    //
    DWORD dwInputFlagsCur;
    LONG lCurMotionXtoX;    // a
    LONG lCurMotionYtoX;    // b
    LONG lCurMotionXoffset; // c
    LONG lCurMotionXtoY;    // d
    LONG lCurMotionYtoY;    // e
    LONG lCurMotionYoffset; // f
    LONG lCurBlendCoef1;
    LONG lCurBlendCoef2;

    //
    // second most recent input frame
    //
    DWORD dwInputFlagsPrev;
    LONG lPrevMotionXtoX;    // a
    LONG lPrevMotionYtoX;    // b
    LONG lPrevMotionXoffset; // c
    LONG lPrevMotionXtoY;    // d
    LONG lPrevMotionYtoY;    // e
    LONG lPrevMotionYoffset; // f
    LONG lPrevBlendCoef1;
    LONG lPrevBlendCoef2;
}   WMT_VIDEOIMAGE_SAMPLE;


//
// Transition IDs for use with WMT_VIDEOIMAGE_SAMPLE2
//
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_BOW_TIE           11")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_CIRCLE            12")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_CROSS_FADE        13")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_DIAGONAL          14")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_DIAMOND           15")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_FADE_TO_COLOR     16")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_FILLED_V          17")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_FLIP              18")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_INSET             19")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_IRIS              20")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_PAGE_ROLL         21")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_RECTANGLE         23")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_REVEAL            24")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_SLIDE             27")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_SPLIT             29")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_STAR              30")
cpp_quote( "#define WMT_VIDEOIMAGE_TRANSITION_WHEEL             31")

typedef struct __WMT_VIDEOIMAGE_SAMPLE2 {
    DWORD dwMagic;
    DWORD dwStructSize; // size of structure; incudes dwMagic and cbStruct
    DWORD dwControlFlags;

    // Viewport size
    DWORD dwViewportWidth;
    DWORD dwViewportHeight;

    // Current image
    DWORD dwCurrImageWidth;
    DWORD dwCurrImageHeight;
    FLOAT fCurrRegionX0;
    FLOAT fCurrRegionY0;
    FLOAT fCurrRegionWidth;
    FLOAT fCurrRegionHeight;
    FLOAT fCurrBlendCoef;

    // Previous image
    DWORD dwPrevImageWidth;
    DWORD dwPrevImageHeight;
    FLOAT fPrevRegionX0;
    FLOAT fPrevRegionY0;
    FLOAT fPrevRegionWidth;
    FLOAT fPrevRegionHeight;
    FLOAT fPrevBlendCoef;

    // Transition effect type
    DWORD dwEffectType;

    // Transition effect parameters
    DWORD dwNumEffectParas;
    FLOAT fEffectPara0;
    FLOAT fEffectPara1;
    FLOAT fEffectPara2;
    FLOAT fEffectPara3;
    FLOAT fEffectPara4;

    // Keep previous image
    BOOL bKeepPrevImage;
} WMT_VIDEOIMAGE_SAMPLE2;


///////////////////////////////////////////////////////////////////////////////
//
// Media-type structures and GUIDs.
//
///////////////////////////////////////////////////////////////////////////////

//
// We use DirectShow media types in this SDK. However, to avoid conflict with
// their names, we define our own version of the structure. This is exactly
// the same as an AM_MEDIA_TYPE!
//
typedef struct _WMMediaType
{
    GUID majortype;
    GUID subtype;
    BOOL bFixedSizeSamples;
    BOOL bTemporalCompression;
    ULONG lSampleSize;
    GUID formattype;
    IUnknown *pUnk;
    ULONG cbFormat;
    [size_is(cbFormat)] BYTE *pbFormat;
} WM_MEDIA_TYPE;


cpp_quote( "typedef struct tagWMVIDEOINFOHEADER" )
cpp_quote( "{" )
cpp_quote( "    //" )
cpp_quote( "    // The bit we really want to use." )
cpp_quote( "    //" )
cpp_quote( "    RECT rcSource;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Where the video should go." )
cpp_quote( "    //" )
cpp_quote( "    RECT rcTarget;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Approximate bit data rate." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwBitRate;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Bit error rate for this stream." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwBitErrorRate;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Average time per frame (100ns units)." )
cpp_quote( "    //" )
cpp_quote( "    LONGLONG AvgTimePerFrame;" )
cpp_quote( "" )
cpp_quote( "    BITMAPINFOHEADER bmiHeader;" )
cpp_quote( "} WMVIDEOINFOHEADER;" )


cpp_quote( "typedef struct tagWMVIDEOINFOHEADER2" )
cpp_quote( "{" )
cpp_quote( "    //" )
cpp_quote( "    // The bit we really want to use." )
cpp_quote( "    //" )
cpp_quote( "    RECT rcSource;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Where the video should go." )
cpp_quote( "    //" )
cpp_quote( "    RECT rcTarget;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Approximate bit data rate." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwBitRate;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Bit error rate for this stream." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwBitErrorRate;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Average time per frame (100ns units)." )
cpp_quote( "    //" )
cpp_quote( "    LONGLONG AvgTimePerFrame;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Use AMINTERLACE_* defines. Reject connection if undefined bits are not 0." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwInterlaceFlags;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // use AMCOPYPROTECT_* defines. Reject connection if undefined bits are not 0." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwCopyProtectFlags;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // X dimension of picture aspect ratio, e.g. 16 for 16x9 display." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwPictAspectRatioX;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Y dimension of picture aspect ratio, e.g.  9 for 16x9 display." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwPictAspectRatioY;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Must be 0; reject connection otherwise." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwReserved1;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Must be 0; reject connection otherwise." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwReserved2;" )
cpp_quote( "" )
cpp_quote( "    BITMAPINFOHEADER bmiHeader;" )
cpp_quote( "} WMVIDEOINFOHEADER2;" )


cpp_quote( "typedef struct tagWMMPEG2VIDEOINFO" )
cpp_quote( "{" )
cpp_quote( "    //" )
cpp_quote( "    // Video info header2." )
cpp_quote( "    //" )
cpp_quote( "    WMVIDEOINFOHEADER2 hdr;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Not used for DVD." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwStartTimeCode;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Is 0 for DVD (no sequence header)." )
cpp_quote( "    //" )
cpp_quote( "    DWORD cbSequenceHeader;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Use enum MPEG2Profile." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwProfile;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Use enum MPEG2Level." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwLevel;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Use AMMPEG2_* defines.  Reject connection if undefined bits are not 0." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwFlags;" )
cpp_quote( "" )
cpp_quote( "    //" )
cpp_quote( "    // Sequence header." )
cpp_quote( "    //" )
cpp_quote( "    DWORD dwSequenceHeader[1];" )
cpp_quote( "" )
cpp_quote( "} WMMPEG2VIDEOINFO;" )

cpp_quote( "typedef struct tagWMSCRIPTFORMAT" )
cpp_quote( "{" )
cpp_quote( "    GUID    scriptType; ")
cpp_quote( "} WMSCRIPTFORMAT;" )

//
// This special GUID is used to create a subtype from an audio format tag, or
// video four-character code. Just fill in the first DWORD of the GUID with
// the appropriate value.
//
cpp_quote( "// 00000000-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_Base " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_Base, " )
cpp_quote( "0x00000000, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 73646976-0000-0010-8000-00AA00389B71  'vids' == WMMEDIATYPE_Video " )
cpp_quote( "EXTERN_GUID(WMMEDIATYPE_Video, " )
cpp_quote( "0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// e436eb78-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB1 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB1, " )
cpp_quote( "0xe436eb78, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// e436eb79-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB4 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB4, " )
cpp_quote( "0xe436eb79, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// e436eb7a-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB8 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB8, " )
cpp_quote( "0xe436eb7a, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// e436eb7b-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB565 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB565, " )
cpp_quote( "0xe436eb7b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// e436eb7c-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB555 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB555, " )
cpp_quote( "0xe436eb7c, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// e436eb7d-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB24 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB24, " )
cpp_quote( "0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// e436eb7e-524f-11ce-9f53-0020af0ba770            MEDIASUBTYPE_RGB32 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_RGB32, " )
cpp_quote( "0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); " )

cpp_quote( "// 30323449-0000-0010-8000-00AA00389B71  'I420' ==  MEDIASUBTYPE_I420 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_I420, " )
cpp_quote( "0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 56555949-0000-0010-8000-00AA00389B71  'IYUV' ==  MEDIASUBTYPE_IYUV " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_IYUV, " )
cpp_quote( "0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 32315659-0000-0010-8000-00AA00389B71  'YV12' ==  MEDIASUBTYPE_YV12 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_YV12, " )
cpp_quote( "0x32315659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 32595559-0000-0010-8000-00AA00389B71  'YUY2' == MEDIASUBTYPE_YUY2 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_YUY2, " )
cpp_quote( "0x32595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 32323450-0000-0010-8000-00AA00389B71  'P422' == MEDIASUBTYPE_P422 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_P422, " )
cpp_quote( "0x32323450, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 59565955-0000-0010-8000-00AA00389B71  'UYVY' ==  MEDIASUBTYPE_UYVY " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_UYVY, " )
cpp_quote( "0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 55595659-0000-0010-8000-00AA00389B71  'YVYU' == MEDIASUBTYPE_YVYU " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_YVYU, " )
cpp_quote( "0x55595659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 39555659-0000-0010-8000-00AA00389B71  'YVU9' == MEDIASUBTYPE_YVU9 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_YVU9, " )
cpp_quote( "0x39555659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 1d4a45f2-e5f6-4b44-8388-f0ae5c0e0c37            MEDIASUBTYPE_VIDEOIMAGE " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_VIDEOIMAGE,  " )
cpp_quote( "0x1d4a45f2, 0xe5f6, 0x4b44, 0x83, 0x88, 0xf0, 0xae, 0x5c, 0x0e, 0x0c, 0x37); " )

cpp_quote( "// 3334504D-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_MP43 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_MP43, " )
cpp_quote( "0x3334504D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 5334504D-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_MP4S " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_MP4S, " )
cpp_quote( "0x5334504D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 3253344D-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_M4S2 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_M4S2, " )
cpp_quote( "0x3253344D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 31564D57-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMV1 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMV1, " )
cpp_quote( "0x31564D57, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 32564D57-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMV2 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMV2, " )
cpp_quote( "0x32564D57, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 3153534D-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_MSS1 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_MSS1, " )
cpp_quote( "0x3153534D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// E06D8026-DB46-11CF-B4D1-00805F6CBBEA            WMMEDIASUBTYPE_MPEG2_VIDEO " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_MPEG2_VIDEO, " )
cpp_quote( "0xe06d8026, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea); " )

cpp_quote( "// 73647561-0000-0010-8000-00AA00389B71  'auds' == WMMEDIATYPE_Audio " )
cpp_quote( "EXTERN_GUID(WMMEDIATYPE_Audio, " )
cpp_quote( "0x73647561, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 00000001-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_PCM " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_PCM, " )
cpp_quote( "0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000009-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_DRM " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_DRM, " )
cpp_quote( "0x00000009, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000162-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMAudioV9 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMAudioV9, " )
cpp_quote( "0x00000162, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000163-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMAudio_Lossless " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMAudio_Lossless, " )
cpp_quote( "0x00000163, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 3253534D-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_MSS2 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_MSS2, " )
cpp_quote( "0x3253534D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 0000000A-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMSP1 " )
cpp_quote( "EXTERN_GUID( WMMEDIASUBTYPE_WMSP1, " )
cpp_quote( "0x0000000A,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71); " )

cpp_quote( "// 0000000B-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMSP2 " )
cpp_quote( "EXTERN_GUID( WMMEDIASUBTYPE_WMSP2, " )
cpp_quote( "0x0000000B,0x0000,0x0010,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71); " )

cpp_quote( "// 33564D57-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMV3 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMV3, " )
cpp_quote( "0x33564D57, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 50564D57-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMVP " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMVP, " )
cpp_quote( "0x50564D57, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 32505657-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WVP2 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WVP2, " )
cpp_quote( "0x32505657, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 41564D57-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMVA " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMVA, " )
cpp_quote( "0x41564D57, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 31435657-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WVC1 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WVC1, " )
cpp_quote( "0x31435657, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

//
// WM Audio v2 and v7 are actually compatible bitstreams.
//
cpp_quote( "// 00000161-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMAudioV8 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMAudioV8, " )
cpp_quote( "0x00000161, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000161-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMAudioV7 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMAudioV7, " )
cpp_quote( "0x00000161, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000161-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_WMAudioV2 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WMAudioV2, " )
cpp_quote( "0x00000161, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000130-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_ACELPnet " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_ACELPnet, " )
cpp_quote( "0x00000130, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 00000055-0000-0010-8000-00AA00389B71            WMMEDIASUBTYPE_MP3 " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_MP3, " )
cpp_quote( "0x00000055, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71); " )

cpp_quote( "// 776257D4-C627-41CB-8F81-7AC7FF1C40CC            WMMEDIASUBTYPE_WebStream " )
cpp_quote( "EXTERN_GUID(WMMEDIASUBTYPE_WebStream, " )
cpp_quote( "0x776257d4, 0xc627, 0x41cb, 0x8f, 0x81, 0x7a, 0xc7, 0xff, 0x1c, 0x40, 0xcc); " )

cpp_quote( "// 73636d64-0000-0010-8000-00AA00389B71  'scmd' == WMMEDIATYPE_Script " )
cpp_quote( "EXTERN_GUID(WMMEDIATYPE_Script, " )
cpp_quote( "0x73636d64, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); " )

cpp_quote( "// 34A50FD8-8AA5-4386-81FE-A0EFE0488E31  'imag' == WMMEDIATYPE_Image " )
cpp_quote( "EXTERN_GUID(WMMEDIATYPE_Image, " )
cpp_quote( "0x34a50fd8, 0x8aa5, 0x4386, 0x81, 0xfe, 0xa0, 0xef, 0xe0, 0x48, 0x8e, 0x31); " )

cpp_quote( "// D9E47579-930E-4427-ADFC-AD80F290E470  'fxfr' == WMMEDIATYPE_FileTransfer " )
cpp_quote( "EXTERN_GUID(WMMEDIATYPE_FileTransfer, " )
cpp_quote( "0xd9e47579, 0x930e, 0x4427, 0xad, 0xfc, 0xad, 0x80, 0xf2, 0x90, 0xe4, 0x70); " )

cpp_quote( "// 9BBA1EA7-5AB2-4829-BA57-0940209BCF3E      'text' == WMMEDIATYPE_Text " )
cpp_quote( "EXTERN_GUID(WMMEDIATYPE_Text, " )
cpp_quote( "0x9bba1ea7, 0x5ab2, 0x4829, 0xba, 0x57, 0x9, 0x40, 0x20, 0x9b, 0xcf, 0x3e); " )

cpp_quote( "// 05589F80-C356-11CE-BF01-00AA0055595A        WMFORMAT_VideoInfo " )
cpp_quote( "EXTERN_GUID(WMFORMAT_VideoInfo, " )
cpp_quote( "0x05589f80, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a); " )

cpp_quote( "// E06D80E3-DB46-11CF-B4D1-00805F6CBBEA        WMFORMAT_MPEG2Video " )
cpp_quote( "EXTERN_GUID(WMFORMAT_MPEG2Video, " )
cpp_quote( "0xe06d80e3, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea); " )

cpp_quote( "// 05589F81-C356-11CE-BF01-00AA0055595A        WMFORMAT_WaveFormatEx " )
cpp_quote( "EXTERN_GUID(WMFORMAT_WaveFormatEx, " )
cpp_quote( "0x05589f81, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a); " )

cpp_quote( "// 5C8510F2-DEBE-4CA7-BBA5-F07A104F8DFF        WMFORMAT_Script " )
cpp_quote( "EXTERN_GUID(WMFORMAT_Script, " )
cpp_quote( "0x5c8510f2, 0xdebe, 0x4ca7, 0xbb, 0xa5, 0xf0, 0x7a, 0x10, 0x4f, 0x8d, 0xff); " )

cpp_quote( "// DA1E6B13-8359-4050-B398-388E965BF00C        WMFORMAT_WebStream " )
cpp_quote( "EXTERN_GUID(WMFORMAT_WebStream, " )
cpp_quote( "0xda1e6b13, 0x8359, 0x4050, 0xb3, 0x98, 0x38, 0x8e, 0x96, 0x5b, 0xf0, 0x0c); " )

cpp_quote( "// 82F38A70-C29F-11D1-97AD-00A0C95EA850        WMSCRIPTTYPE_TwoStrings " )
cpp_quote( "EXTERN_GUID( WMSCRIPTTYPE_TwoStrings, " )
cpp_quote( "0x82f38a70,0xc29f,0x11d1,0x97,0xad,0x00,0xa0,0xc9,0x5e,0xa8,0x50); " )

//////////////////////////////////////////////////////////////////////////////
//
// GUIDs for common buffer properties
//
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_OutputCleanPoint, 0xf72a3c6f, 0x6eb4, 0x4ebc, 0xb1, 0x92, 0x9, 0xad, 0x97, 0x59, 0xe8, 0x28 );" )
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_Timecode, 0x399595ec, 0x8667, 0x4e2d, 0x8f, 0xdb, 0x98, 0x81, 0x4c, 0xe7, 0x6c, 0x1e);" )
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_ChromaLocation, 0x4c5acca0, 0x9276, 0x4b2c, 0x9e, 0x4c, 0xa0, 0xed, 0xef, 0xdd, 0x21, 0x7e);" )
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_ColorSpaceInfo, 0xf79ada56, 0x30eb, 0x4f2b, 0x9f, 0x7a, 0xf2, 0x4b, 0x13, 0x9a, 0x11, 0x57 );" )
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_UserDataInfo, 0x732bb4fa, 0x78be, 0x4549, 0x99, 0xbd, 0x2, 0xdb, 0x1a, 0x55, 0xb7, 0xa8 );" )

//
// This buffer property is used in conjunction with file transfer streams.
// It is the name of the file being transfered (in WCHARs).
//
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_FileName, 0xe165ec0e, 0x19ed, 0x45d7, 0xb4, 0xa7, 0x25, 0xcb, 0xd1, 0xe2, 0x8e, 0x9b);" )

cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_ContentType, 0xd590dc20, 0x07bc, 0x436c, 0x9c, 0xf7, 0xf3, 0xbb, 0xfb, 0xf1, 0xa4, 0xdc );" )
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_PixelAspectRatio, 0x1b1ee554, 0xf9ea, 0x4bc8, 0x82, 0x1a, 0x37, 0x6b, 0x74, 0xe4, 0xc4, 0xb8 );" )
cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_SampleDuration, 0xc6bd9450, 0x867f, 0x4907, 0x83, 0xa3, 0xc7, 0x79, 0x21, 0xb7, 0x33, 0xad );" )

cpp_quote( "EXTERN_GUID( WM_SampleExtensionGUID_SampleProtectionSalt, 0x5403deee, 0xb9ee, 0x438f, 0xaa, 0x83, 0x38, 0x4, 0x99, 0x7e, 0x56, 0x9d );" )


//
// Constants for use with the corresponding sample extension properties
//
cpp_quote( "#define WM_SampleExtension_ContentType_Size         1" )
cpp_quote( "#define WM_SampleExtension_PixelAspectRatio_Size    2" )
cpp_quote( "#define WM_SampleExtension_Timecode_Size           14" )
cpp_quote( "#define WM_SampleExtension_SampleDuration_Size      2" )
cpp_quote( "#define WM_SampleExtension_ChromaLocation_Size      1" )
cpp_quote( "#define WM_SampleExtension_ColorSpaceInfo_Size      3" )

///////////////////////////////////////////////////////////////////////////////
//
// Content Types to be used with WM_SampleExtensionGUID_ContentType
// on INSSBuffer3::SetProperty/GetProperty
//
///////////////////////////////////////////////////////////////////////////////
cpp_quote( "#define WM_CT_REPEAT_FIRST_FIELD 0x10" )
cpp_quote( "#define WM_CT_BOTTOM_FIELD_FIRST 0x20" )
cpp_quote( "#define WM_CT_TOP_FIELD_FIRST    0x40" )
cpp_quote( "#define WM_CT_INTERLACED         0x80" )

///////////////////////////////////////////////////////////////////////////////
//
// Chroma Locations to be used with WM_SampleExtensionGUID_ChromaLocation
// on INSSBuffer3::SetProperty/GetProperty
//
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "#define WM_CL_INTERLACED420   0" )
cpp_quote( "#define WM_CL_PROGRESSIVE420  1" )

///////////////////////////////////////////////////////////////////////////////
//
// Color Space Info to be used with WM_SampleExtension_ColorSpaceInfo
// on INSSBuffer3::SetProperty/GetProperty
//
///////////////////////////////////////////////////////////////////////////////

#pragma pack(push)
#pragma pack(1)

typedef struct _WMT_COLORSPACEINFO_EXTENSION_DATA
{
    BYTE ucColorPrimaries;
    BYTE ucColorTransferChar;
    BYTE ucColorMatrixCoef;
} WMT_COLORSPACEINFO_EXTENSION_DATA;

#pragma pack(pop)

///////////////////////////////////////////////////////////////////////////////
//
// Timecode structures to be used with WM_SampleExtensionGUID_Timecode
// on INSSBuffer3::SetProperty/GetProperty.  The timecode DWORD
// contains the following timecode representation:
//
// BYTE  MSB             LSB
// ----------------------------------------------
// 1     Tens of hour    Hour
// 2     Tens of minute  Minute
// 3     Tens of second  Second
// 4     Tens of frame   Frame
//
///////////////////////////////////////////////////////////////////////////////

#pragma pack(push)
#pragma pack(2)

typedef struct _WMT_TIMECODE_EXTENSION_DATA
{
    WORD wRange;
    DWORD dwTimecode;
    DWORD dwUserbits;
    DWORD dwAmFlags;
} WMT_TIMECODE_EXTENSION_DATA;

#pragma pack(pop)


///////////////////////////////////////////////////////////////////////////////
//
// WMDRM-ND structures and constants
//
///////////////////////////////////////////////////////////////////////////////

typedef struct _DRM_VAL16
{
    BYTE val[16];

} DRM_VAL16;

///////////////////////////////////////////////////////////////////////////////
//
// IID GUIDs defined here.
//
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "EXTERN_GUID( IID_IWMMediaProps,         0x96406bce,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMVideoMediaProps,    0x96406bcf,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriter,             0x96406bd4,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMInputMediaProps,    0x96406bd5,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMReader,             0x96406bd6,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMSyncReader,         0x9397f121,0x7705,0x4dc9,0xb0,0x49,0x98,0xb6,0x98,0x18,0x84,0x14 );" )
cpp_quote( "EXTERN_GUID( IID_IWMSyncReader2,        0xfaed3d21,0x1b6b,0x4af7,0x8c,0xb6,0x3e,0x18,0x9b,0xbc,0x18,0x7b );" )
cpp_quote( "EXTERN_GUID( IID_IWMOutputMediaProps,   0x96406bd7,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMStatusCallback,     0x6d7cdc70,0x9888,0x11d3,0x8e,0xdc,0x00,0xc0,0x4f,0x61,0x09,0xcf );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderCallback,     0x96406bd8,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMCredentialCallback, 0x342e0eb7,0xe651,0x450c,0x97,0x5b,0x2a,0xce,0x2c,0x90,0xc4,0x8e );" )
cpp_quote( "EXTERN_GUID( IID_IWMMetadataEditor,     0x96406bd9,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMMetadataEditor2,    0x203cffe3,0x2e18,0x4fdf,0xb5,0x9d,0x6e,0x71,0x53,0x05,0x34,0xcf );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMEditor,          0xFF130EBC,0xA6C3,0x42A6,0xB4,0x01,0xC3,0x38,0x2C,0x3E,0x08,0xB3 );" )
cpp_quote( "EXTERN_GUID( IID_IWMHeaderInfo,         0x96406bda,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMHeaderInfo2,        0x15cf9781,0x454e,0x482e,0xb3,0x93,0x85,0xfa,0xe4,0x87,0xa8,0x10 );" )
cpp_quote( "EXTERN_GUID( IID_IWMHeaderInfo3,        0x15CC68E3,0x27CC,0x4ecd,0xB2,0x22,0x3F,0x5D,0x02,0xD8,0x0B,0xD5 );" )
cpp_quote( "EXTERN_GUID( IID_IWMProfileManager,     0xd16679f2,0x6ca0,0x472d,0x8d,0x31,0x2f,0x5d,0x55,0xae,0xe1,0x55 );" )
cpp_quote( "EXTERN_GUID( IID_IWMProfileManager2,    0x7a924e51,0x73c1,0x494d,0x80,0x19,0x23,0xd3,0x7e,0xd9,0xb8,0x9a );" )
cpp_quote( "EXTERN_GUID( IID_IWMProfileManagerLanguage, 0xba4dcc78,0x7ee0,0x4ab8,0xb2,0x7a,0xdb,0xce,0x8b,0xc5,0x14,0x54 );" )
cpp_quote( "EXTERN_GUID( IID_IWMProfile,            0x96406bdb,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMProfile2,           0x07e72d33,0xd94e,0x4be7,0x88,0x43,0x60,0xae,0x5f,0xf7,0xe5,0xf5 );" )
cpp_quote( "EXTERN_GUID( IID_IWMProfile3,           0x00ef96cc,0xa461,0x4546,0x8b,0xcd,0xc9,0xa2,0x8f,0x0e,0x06,0xf5 );" )
cpp_quote( "EXTERN_GUID( IID_IWMStreamConfig,       0x96406bdc,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMStreamConfig2,      0x7688d8cb,0xfc0d,0x43bd,0x94,0x59,0x5a,0x8d,0xec,0x20,0x0c,0xfa );" )
cpp_quote( "EXTERN_GUID( IID_IWMStreamConfig3,      0xcb164104,0x3aa9,0x45a7,0x9a,0xc9,0x4d,0xae,0xe1,0x31,0xd6,0xe1 );" )
cpp_quote( "EXTERN_GUID( IID_IWMStreamList,         0x96406bdd,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMMutualExclusion,    0x96406bde,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMMutualExclusion2,   0x302b57d,0x89d1,0x4ba2,0x85,0xc9,0x16,0x6f,0x2c,0x53,0xeb,0x91 );" )
cpp_quote( "EXTERN_GUID( IID_IWMBandwidthSharing,   0xad694af1,0xf8d9,0x42f8,0xbc,0x47,0x70,0x31,0x1b,0x0c,0x4f,0x9e );" )
cpp_quote( "EXTERN_GUID( IID_IWMStreamPrioritization, 0x8c1c6090,0xf9a8,0x4748,0x8e,0xc3,0xdd,0x11,0x08,0xba,0x1e,0x77 );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterAdvanced,     0x96406be3,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterAdvanced2,    0x962dc1ec,0xc046,0x4db8,0x9c,0xc7,0x26,0xce,0xae,0x50,0x08,0x17 );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterAdvanced3,    0x2cd6492d,0x7c37,0x4e76,0x9d,0x3b,0x59,0x26,0x11,0x83,0xa2,0x2e );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterPreprocess,   0xfc54a285,0x38c4,0x45b5,0xaa,0x23,0x85,0xb9,0xf7,0xcb,0x42,0x4b );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterSink,         0x96406be4,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterFileSink,     0x96406be5,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterFileSink2,    0x14282ba7,0x4aef,0x4205,0x8c,0xe5,0xc2,0x29,0x03,0x5a,0x05,0xbc );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterFileSink3,    0x3fea4feb,0x2945,0x47a7,0xa1,0xdd,0xc5,0x3a,0x8f,0xc4,0xc4,0x5c );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterNetworkSink,  0x96406be7,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMClientConnections,  0x73c66010,0xa299,0x41df,0xb1,0xf0,0xcc,0xf0,0x3b,0x09,0xc1,0xc6 );" )
cpp_quote( "EXTERN_GUID( IID_IWMClientConnections2, 0x4091571e,0x4701,0x4593,0xbb,0x3d,0xd5,0xf5,0xf0,0xc7,0x42,0x46 ); " )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAdvanced,     0x96406bea,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAdvanced2,    0xae14a945,0xb90c,0x4d0d,0x91,0x27,0x80,0xd6,0x65,0xf7,0xd7,0x3e );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAdvanced3,    0x5dc0674b,0xf04b,0x4a4e,0x9f,0x2a,0xb1,0xaf,0xde,0x2c,0x81,0x00 );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAdvanced4,    0x945a76a2,0x12ae,0x4d48,0xbd,0x3c,0xcd,0x1d,0x90,0x39,0x9b,0x85 );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAdvanced5,    0x24c44db0,0x55d1,0x49ae,0xa5,0xcc,0xf1,0x38,0x15,0xe3,0x63,0x63 );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAdvanced6,    0x18a2e7f8,0x428f,0x4acd,0x8a,0x00,0xe6,0x46,0x39,0xbc,0x93,0xde );" )
cpp_quote( "EXTERN_GUID( IID_IWMPlayerHook,         0xe5b7ca9a,0x0f1c,0x4f66,0x90,0x02,0x74,0xec,0x50,0xd8,0xb3,0x04 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMReader,          0xd2827540,0x3ee7,0x432c,0xb1,0x4c,0xdc,0x17,0xf0,0x85,0xd3,0xb3 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMReader2,         0xbefe7a75,0x9f1d,0x4075,0xb9,0xd9,0xa3,0xc3,0x7b,0xda,0x49,0xa0 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMReader3,         0xe08672de,0xf1e7,0x4ff4,0xa0,0xa3,0xfc,0x4b,0x08,0xe4,0xca,0xf8 );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderPlaylistBurn, 0xf28c0300,0x9baa,0x4477,0xa8,0x46,0x17,0x44,0xd9,0xcb,0xf5,0x33 );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderCallbackAdvanced, 0x96406beb,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderNetworkConfig,0x96406bec,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderStreamClock,  0x96406bed,0x2b2b,0x11d3,0xb3,0x6b,0x00,0xc0,0x4f,0x61,0x08,0xff );" )
cpp_quote( "EXTERN_GUID( IID_IWMIndexer,            0x6d7cdc71,0x9888,0x11d3,0x8e,0xdc,0x00,0xc0,0x4f,0x61,0x09,0xcf );" )
cpp_quote( "EXTERN_GUID( IID_IWMIndexer2,           0xb70f1e42,0x6255,0x4df0,0xa6,0xb9,0x02,0xb2,0x12,0xd9,0xe2,0xbb );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAllocatorEx,  0x9f762fa7,0xa22e,0x428d,0x93,0xc9,0xac,0x82,0xf3,0xaa,0xfe,0x5a );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderTypeNegotiation, 0xfdbe5592,0x81a1,0x41ea,0x93,0xbd,0x73,0x5c,0xad,0x1a,0xdc,0x5 );" )
cpp_quote( "EXTERN_GUID( IID_IWMLicenseBackup,      0x05E5AC9F,0x3FB6,0x4508,0xBB,0x43,0xA4,0x06,0x7B,0xA1,0xEB,0xE8);")
cpp_quote( "EXTERN_GUID( IID_IWMLicenseRestore,     0xC70B6334,0xa22e,0x4efb,0xA2,0x45,0x15,0xE6,0x5A,0x00,0x4A,0x13);")
cpp_quote( "EXTERN_GUID( IID_IWMBackupRestoreProps, 0x3C8E0DA6,0x996F,0x4ff3,0xA1,0xAF,0x48,0x38,0xF9,0x37,0x7e,0x2e);")
cpp_quote( "EXTERN_GUID( IID_IWMPacketSize,         0xcdfb97ab,0x188f,0x40b3,0xb6,0x43,0x5b,0x79,0x03,0x97,0x5c,0x59);")
cpp_quote( "EXTERN_GUID( IID_IWMPacketSize2,        0x8bfc2b9e,0xb646,0x4233,0xa8,0x77,0x1c,0x6a,0x7,0x96,0x69,0xdc);")
cpp_quote( "EXTERN_GUID( IID_IWMRegisterCallback,   0xcf4b1f99,0x4de2,0x4e49,0xa3,0x63,0x25,0x27,0x40,0xd9,0x9b,0xc1);")
cpp_quote( "EXTERN_GUID( IID_IWMWriterPostView,     0x81e20ce4,0x75ef,0x491a,0x80,0x04,0xfc,0x53,0xc4,0x5b,0xdc,0x3e);")
cpp_quote( "EXTERN_GUID( IID_IWMWriterPostViewCallback, 0xd9d6549d,0xa193,0x4f24,0xb3,0x08,0x03,0x12,0x3d,0x9b,0x7f,0x8d);")
cpp_quote( "EXTERN_GUID( IID_IWMCodecInfo,          0xa970f41e,0x34de,0x4a98,0xb3,0xba,0xe4,0xb3,0xca,0x75,0x28,0xf0);")
cpp_quote( "EXTERN_GUID( IID_IWMCodecInfo2,         0xaa65e273,0xb686,0x4056,0x91,0xec,0xdd,0x76,0x8d,0x4d,0xf7,0x10);")
cpp_quote( "EXTERN_GUID( IID_IWMCodecInfo3,         0x7e51f487,0x4d93,0x4f98,0x8a,0xb4,0x27,0xd0,0x56,0x5a,0xdc,0x51);")
cpp_quote( "EXTERN_GUID( IID_IWMPropertyVault,      0x72995A79,0x5090,0x42a4,0x9C,0x8C,0xD9,0xD0,0xB6,0xD3,0x4B,0xE5 );" )
cpp_quote( "EXTERN_GUID( IID_IWMIStreamProps,       0x6816dad3,0x2b4b,0x4c8e,0x81,0x49,0x87,0x4c,0x34,0x83,0xa7,0x53 );" )
cpp_quote( "EXTERN_GUID( IID_IWMLanguageList,       0xdf683f00,0x2d49,0x4d8e,0x92,0xb7,0xfb,0x19,0xf6,0xa0,0xdc,0x57 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMWriter,          0xd6ea5dd0,0x12a0,0x43f4,0x90,0xab,0xa3,0xfd,0x45,0x1e,0x6a,0x07 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMWriter2,         0x38ee7a94,0x40e2,0x4e10,0xaa,0x3f,0x33,0xfd,0x32,0x10,0xed,0x5b );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMWriter3,         0xa7184082,0xa4aa,0x4dde,0xac,0x9c,0xe7,0x5d,0xbd,0x11,0x17,0xce );" )
cpp_quote( "EXTERN_GUID( IID_IWMWriterPushSink,      0xdc10e6a5,0x072c,0x467d,0xbf,0x57,0x63,0x30,0xa9,0xdd,0xe1,0x2a );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderNetworkConfig2,0xd979a853,0x042b,0x4050,0x83,0x87,0xc9,0x39,0xdb,0x22,0x01,0x3f );" )
cpp_quote( "EXTERN_GUID( IID_IWMWatermarkInfo,       0x6f497062,0xf2e2,0x4624,0x8e,0xa7,0x9d,0xd4,0x0d,0x81,0xfc,0x8d );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderAccelerator,   0xbddc4d08,0x944d,0x4d52,0xa6,0x12,0x46,0xc3,0xfd,0xa0,0x7d,0xd4 );" )
cpp_quote( "EXTERN_GUID( IID_IWMReaderTimecode,        0xf369e2f0,0xe081,0x4fe6,0x84,0x50,0xb8,0x10,0xb2,0xf4,0x10,0xd1 );" )
cpp_quote( "EXTERN_GUID( IID_IWMImageInfo,            0x9f0aa3b6,0x7267,0x4d89,0x88,0xf2,0xba,0x91,0x5a,0xa5,0xc4,0xc6);" )
cpp_quote( "EXTERN_GUID( IID_IWMAddressAccess,        0xBB3C6389,0x1633,0x4e92,0xAF,0x14,0x9F,0x31,0x73,0xBA,0x39,0xD0 );" )
cpp_quote( "EXTERN_GUID( IID_IWMAddressAccess2,       0x65a83fc2,0x3e98,0x4d4d,0x81,0xb5,0x2a,0x74,0x28,0x86,0xb3,0x3d );" )
cpp_quote( "EXTERN_GUID( IID_IWMDeviceRegistration,   0xf6211f03,0x8d21,0x4e94,0x93,0xe6,0x85,0x10,0x80,0x5f,0x2d,0x99 );" )
cpp_quote( "EXTERN_GUID( IID_IWMRegisteredDevice,     0xa4503bec,0x5508,0x4148,0x97,0xac,0xbf,0xa7,0x57,0x60,0xa7,0x0d );" )
cpp_quote( "EXTERN_GUID( IID_IWMProximityDetection,   0x6A9FD8EE,0xB651,0x4bf0,0xB8,0x49,0x7D,0x4E,0xCE,0x79,0xA2,0xB1 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMMessageParser,     0xa73a0072,0x25a0,0x4c99,0xb4,0xa5,0xed,0xe8,0x10,0x1a,0x6c,0x39 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMTranscryptor,      0x69059850,0x6e6f,0x4bb2,0x80,0x6f,0x71,0x86,0x3d,0xdf,0xc4,0x71 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMTranscryptor2,     0xe0da439f,0xd331,0x496a,0xbe,0xce,0x18,0xe5,0xba,0xc5,0xdd,0x23 );" )
cpp_quote( "EXTERN_GUID( IID_IWMDRMTranscryptionManager, 0xb1a887b2,0xa4f0,0x407a,0xb0,0x2e,0xef,0xbd,0x23,0xbb,0xec,0xdf );" )
cpp_quote( "EXTERN_GUID( IID_IWMLicenseRevocationAgent, 0x6967f2c9,0x4e26,0x4b57,0x88,0x94,0x79,0x98,0x80,0xf7,0xac,0x7b );" )


///////////////////////////////////////////////////////////////////////////////
//
// Other GUIDs defined here
//
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "EXTERN_GUID( CLSID_WMMUTEX_Language, 0xD6E22A00,0x35DA,0x11D1,0x90,0x34,0x00,0xA0,0xC9,0x03,0x49,0xBE );" )
cpp_quote( "EXTERN_GUID( CLSID_WMMUTEX_Bitrate, 0xD6E22A01,0x35DA,0x11D1,0x90,0x34,0x00,0xA0,0xC9,0x03,0x49,0xBE );" )
cpp_quote( "EXTERN_GUID( CLSID_WMMUTEX_Presentation, 0xD6E22A02,0x35DA,0x11D1,0x90,0x34,0x00,0xA0,0xC9,0x03,0x49,0xBE );" )
cpp_quote( "EXTERN_GUID( CLSID_WMMUTEX_Unknown, 0xD6E22A03,0x35DA,0x11D1,0x90,0x34,0x00,0xA0,0xC9,0x03,0x49,0xBE );" )

cpp_quote( "EXTERN_GUID( CLSID_WMBandwidthSharing_Exclusive, 0xaf6060aa,0x5197,0x11d2,0xb6,0xaf,0x00,0xc0,0x4f,0xd9,0x08,0xe9 );" )
cpp_quote( "EXTERN_GUID( CLSID_WMBandwidthSharing_Partial, 0xaf6060ab,0x5197,0x11d2,0xb6,0xaf,0x00,0xc0,0x4f,0xd9,0x08,0xe9 );" )

cpp_quote( "// {B42CDE2B-6178-4a2c-A375-89DD3FD7F497}" )
cpp_quote( "EXTERN_GUID( WMT_DMOCATEGORY_AUDIO_WATERMARK, 0x65221c5a, 0xfa75, 0x4b39, 0xb5, 0x0c, 0x06, 0xc3, 0x36, 0xb6, 0xa3, 0xef );" )
cpp_quote( "// {E77797C6-18AF-4458-BBDD-492D3F78FC8F}" )
cpp_quote( "EXTERN_GUID( WMT_DMOCATEGORY_VIDEO_WATERMARK, 0x187cc922, 0x8efc, 0x4404, 0x9d, 0xaf, 0x63, 0xf4, 0x83, 0x0d, 0xf1, 0xbc );" )

///////////////////////////////////////////////////////////////////////////////
//
// Max Video Streams / Bands
//
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "#define WM_MAX_VIDEO_STREAMS            0x3f" )
cpp_quote( "#define WM_MAX_STREAMS                  0x3f" )

///////////////////////////////////////////////////////////////////////////////
//
// Creation functions.
//
// The SDK supports 3 major objects:
// - CLSID_WMWriter - For writing out WM content.
// - CLSID_WMReader - For playing back WM content.
// - CLSID_WMMetadataEditor - For getting and editing header metadata in WM
//   content.
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
// This function examines a file and determines whether or not it is DRM protected.
//
cpp_quote( "HRESULT STDMETHODCALLTYPE WMIsContentProtected( const WCHAR *pwszFileName, BOOL *pfIsProtected );" )
///////////////////////////////////////////////////////////////////////////////

cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateCertificate( IUnknown** pUnkCert );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateWriter( IUnknown* pUnkCert, IWMWriter **ppWriter );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateReader( IUnknown* pUnkCert, DWORD dwRights, IWMReader **ppReader );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateSyncReader( IUnknown* pUnkCert, DWORD dwRights, IWMSyncReader **ppSyncReader );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateEditor( IWMMetadataEditor **ppEditor );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateIndexer( IWMIndexer **ppIndexer );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateBackupRestorer( IUnknown *pCallback, IWMLicenseBackup **ppBackup );" )

cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateProfileManager( IWMProfileManager **ppProfileManager );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateWriterFileSink( IWMWriterFileSink **ppSink );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateWriterNetworkSink( IWMWriterNetworkSink **ppSink );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateWriterPushSink( IWMWriterPushSink **ppSink );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateDeviceRegistration( IWMDeviceRegistration **ppDevReg );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateDRMTranscryptor( IWMDRMTranscryptor **ppTranscryptor );" )
cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateDRMTranscryptionManager( IWMDRMTranscryptionManager **ppTranscryptionManager );" )

cpp_quote( "HRESULT STDMETHODCALLTYPE WMCreateLicenseRevocationAgent( IUnknown *pCallback, IWMLicenseRevocationAgent ** ppLicenseRevocationAgent );" )

///////////////////////////////////////////////////////////////////////////////
//
// The following interfaces define the media types that this SDK supports.
// These media types are used by the writer, the reader, and the profile
// object, to identify the media-type specific properties of a media stream.
//
// The main media type is stored in the WM_MEDIA_TYPE structure. Some
// interesting (option) parameters may exist for particular stream types;
// in that case, an IWM<x>MediaProps interface can be used to get and set
// these additional parameters.
//


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BCE-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMMediaProps Interface"),
    pointer_default(unique),
    local
]
interface IWMMediaProps : IUnknown
{
    //
    // GetType is provided for convenience; it returns the same as the
    // majortype of the WM_MEDIA_TYPE.
    //
    HRESULT GetType( [out] GUID *pguidType );

    HRESULT GetMediaType( [out] WM_MEDIA_TYPE *pType,
                          [in, out] DWORD *pcbType );

    HRESULT SetMediaType( [in] WM_MEDIA_TYPE *pType );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BCF-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMVideoMediaProps Interface"),
    pointer_default(unique),
    local
]
interface IWMVideoMediaProps : IWMMediaProps
{
    HRESULT GetMaxKeyFrameSpacing( [out] LONGLONG *pllTime );

    HRESULT SetMaxKeyFrameSpacing( [in] LONGLONG llTime );

    HRESULT GetQuality( [out] DWORD *pdwQuality );

    HRESULT SetQuality( [in] DWORD dwQuality );
};

///////////////////////////////////////////////////////////////////////////////
//
// The CLSID_WMWriter basic interfaces.
//
// Usage scenario is as follows:
// 1) SetProfile to define the configuration.
// 2) Set the outputs.
// 3) Call GetInputCount (which is valid after (1)), and GetInputProps for
//    each stream. Get the default input format, and change it if desired.
// 3.5) Call SetAttribute to add metadata to the header
// At this point, the writer has been configured.
// 4) Call WriteSample repeatedly, until done. (Note that the AllocateSample
//    call is just provided for convenience. You are welcome to pass in your
//    own samples.)
// 5) Call Flush to write out any buffered data, and update the header and
//    index.
//
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BD4-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMWriter Interface"),
    pointer_default(unique),
    local
]
interface IWMWriter : IUnknown
{
    // This interface QI's for IWMHeaderInfo, and IWMWriterAdvanced.

    //
    // There are 3 options for setting the profile on the writer. Note that
    // setting the profile means that the profile is copied into the writer.
    // Further editing of that profile object will have no effect, unless
    // SetProfile() is called again.
    //
    // Calling SetProfile() removes any previously set header attribute info
    //
    HRESULT SetProfileByID( [in] REFGUID guidProfile );

    HRESULT SetProfile( [in] IWMProfile *pProfile );

    //
    // The easiest way to use the writer is just to write to file.
    //
    HRESULT SetOutputFilename( [in] const WCHAR *pwszFilename );

    //
    // The user can enumerate through the various inputs, and get the input
    // format. Note that these are not ASF streams; one input stream may map
    // to multiple ASF streams in a MEB scenario.
    //
    // Manipulating the IWMInputMediaProps has no effect on the writer, unless
    // the user calls SetInputProps to configure the input.
    //
    HRESULT GetInputCount( [out] DWORD *pcInputs );

    HRESULT GetInputProps( [in] DWORD dwInputNum,
                           [out] IWMInputMediaProps **ppInput );

    HRESULT SetInputProps( [in] DWORD dwInputNum,
                           [in] IWMInputMediaProps *pInput );

    //
    // Used for determining all possible format types supported by this
    // input on the writer.
    //
    HRESULT GetInputFormatCount(    [in] DWORD dwInputNumber,
                                    [out] DWORD *pcFormats );

    HRESULT GetInputFormat( [in] DWORD dwInputNumber,
                            [in] DWORD dwFormatNumber,
                            [out] IWMInputMediaProps** pProps );

    //
    // You must call BeginWriting before sending any samples, and
    // you must call EndWriting when you're done sending samples.
    //
    HRESULT BeginWriting();

    //
    // EndWriting flushes everything, updates indices and headers,
    // and closes the file.
    //
    HRESULT EndWriting();

    //
    // Allocate a sample. This is optional; the user is welcome to allocate
    // their own buffer class.
    //
    HRESULT AllocateSample( [in] DWORD dwSampleSize,
                            [out] INSSBuffer **ppSample );

    HRESULT WriteSample( [in] DWORD dwInputNum,
                         [in] QWORD cnsSampleTime,
                         [in] DWORD dwFlags,
                         [in] INSSBuffer *pSample );

    //
    // Flush() will flush the writer, but leaves the writer prepared to run
    // again, when WriteSample() is called again.
    // Flush() also causes an updated header to be sent to the sink.
    //
    HRESULT Flush();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( d6ea5dd0-12a0-43f4-90ab-a3fd451e6a07 ),
    helpstring( "IWMDRMWriter Interface"),
    pointer_default(unique),
    local
]
//
// The writer can be QI'd for this interface, which provides helpers
// to generate DRM keys.
//
interface IWMDRMWriter : IUnknown
{
    HRESULT GenerateKeySeed( [out, size_is( *pcwchLength )] WCHAR *pwszKeySeed,
                             [in, out] DWORD *pcwchLength );

    HRESULT GenerateKeyID( [out, size_is( *pcwchLength )] WCHAR *pwszKeyID,
                           [in, out] DWORD *pcwchLength );

    HRESULT GenerateSigningKeyPair( [out, size_is( *pcwchPrivKeyLength )] WCHAR *pwszPrivKey,
                                    [in, out] DWORD *pcwchPrivKeyLength,
                                    [out, size_is( *pcwchPubKeyLength )] WCHAR *pwszPubKey,
                                    [in, out] DWORD *pcwchPubKeyLength );

    HRESULT SetDRMAttribute( [in] WORD wStreamNum,
                             [in] LPCWSTR pszName,
                             [in] WMT_ATTR_DATATYPE Type,
                             [in, size_is( cbLength )] const BYTE *pValue,
                             [in] WORD cbLength );
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( 38ee7a94-40e2-4e10-aa3f-33fd3210ed5b ),
    helpstring( "IWMDRMWriter2 Interface"),
    pointer_default(unique),
    local
]
interface IWMDRMWriter2 : IWMDRMWriter
{
    HRESULT SetWMDRMNetEncryption( [in] BOOL fSamplesEncrypted,
                                   [in] BYTE *pbKeyID,
                                   [in] DWORD cbKeyID );
}

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( a7184082-a4aa-4dde-ac9c-e75dbd1117ce ),
    helpstring( "IWMDRMWriter3 Interface"),
    pointer_default(unique),
    local
]
interface IWMDRMWriter3 : IWMDRMWriter2
{
    HRESULT SetProtectStreamSamples( [in] WMDRM_IMPORT_INIT_STRUCT *pImportInitStruct );
}

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BD5-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMInputMediaProps Interface"),
    pointer_default(unique),
    local
]
interface IWMInputMediaProps : IWMMediaProps
{
    HRESULT GetConnectionName( [out, size_is( *pcchName )] WCHAR *pwszName,
                               [in, out] WORD *pcchName );

    HRESULT GetGroupName( [out, size_is( *pcchName )] WCHAR *pwszName,
                          [in, out] WORD *pcchName );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 72995A79-5090-42a4-9C8C-D9D0B6D34BE5 ),
    helpstring( "IWMPropertyVault Interface"),
    pointer_default(unique),
    local
]
interface IWMPropertyVault : IUnknown
{
    HRESULT GetPropertyCount(
                              [in] DWORD   *pdwCount );

    HRESULT GetPropertyByName(
                              [in] LPCWSTR pszName,
                              [out] WMT_ATTR_DATATYPE *pType,
                              [out, size_is( *pdwSize )] BYTE *pValue,
                              [in, out] DWORD *pdwSize );

    HRESULT SetProperty(
                              [in] LPCWSTR pszName,
                              [in] WMT_ATTR_DATATYPE pType,
                              [in] BYTE *pValue,
                              [in] DWORD dwSize );

    HRESULT GetPropertyByIndex(
                              [in] DWORD   dwIndex,
                              [out, size_is( *pdwNameLen )] LPWSTR pszName,
                              [in, out]  DWORD *pdwNameLen,
                              [out] WMT_ATTR_DATATYPE *pType,
                              [out, size_is( *pdwSize )] BYTE *pValue,
                              [in, out] DWORD *pdwSize );

    HRESULT CopyPropertiesFrom(
                              [in] IWMPropertyVault    *pIWMPropertyVault );

    HRESULT Clear();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 6816dad3-2b4b-4c8e-8149-874c3483a753 ),
    helpstring( "IWMIStreamProps Interface"),
    pointer_default(unique),
    local
]
interface IWMIStreamProps : IUnknown
{
    HRESULT GetProperty(      [in] LPCWSTR pszName,
                              [out] WMT_ATTR_DATATYPE *pType,
                              [out, size_is( *pdwSize )] BYTE *pValue,
                              [in, out] DWORD *pdwSize );
};

///////////////////////////////////////////////////////////////////////////////
//
// The CLSID_WMReader basic interfaces.
//
// Usage is as follows:
// 1) Call Open with a URL (possibly a local filename) and a user-supplied
//    callback. After open has completed, the file has been opened and parsed.
// 2) Call GetOutputCount, and GetOutputProps for each output. This
//    is valid after (1). This allows the user to get the output format for
//    each output.
// 3) Call Start. Status messages and samples will begin arriving in the
//    callback function.
// 4) Continue with any combination of Start/Stop/Pause, until finished.
//
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BD6-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMReader Interface"),
    pointer_default(unique),
    local
]
interface IWMReader : IUnknown
{
    //
    // This interface QI's for IWMHeaderInfo, IWMProfile, IWMReaderAdvanced,
    // IWMReaderAdvanced2, and IWMReaderAdvanced3.
    //

    //
    // Open is an asynch call; it returns almost immediately (if the URL
    // is valid), and the user should wait for appropriate OnStatus calls to
    // be sent to the callback.
    //
    HRESULT Open( [in] const WCHAR *pwszURL,
                  [in] IWMReaderCallback *pCallback,
                  [in] void *pvContext );

    HRESULT Close();

    //
    // The user can enumerate through the various outputs, and get the
    // output format for that data.
    //
    // Manipulating the IWMOutputMediaProps has no effect on the output, unless
    // the user also calls SetOutputProps.
    //
    HRESULT GetOutputCount( [out] DWORD *pcOutputs );

    HRESULT GetOutputProps( [in] DWORD dwOutputNum,
                            [out] IWMOutputMediaProps **ppOutput );

    HRESULT SetOutputProps( [in] DWORD dwOutputNum,
                            [in] IWMOutputMediaProps *pOutput );

    //
    // Used for determining all possible format types supported by this
    // output on the reader.
    //
    HRESULT GetOutputFormatCount(   [in] DWORD dwOutputNumber,
                                    [out] DWORD *pcFormats );

    HRESULT GetOutputFormat( [in] DWORD dwOutputNumber,
                             [in] DWORD dwFormatNumber,
                             [out] IWMOutputMediaProps** ppProps );

    //
    // If duration is 0, play to the end of the file.
    // If msStart is set to WM_START_CURRENTPOSITION then don't perform a seek
    // operation.  A good use for this is when you want to change the rate but
    // not the current file position.
    //
    // Note that any call to start while Paused will be treated as a seek.
    // Even calls to Start( WM_START_CURRENTPOSITION, ... ).  If your intention
    // is to seek (which will incur the buffering penalty from network files)
    // then you can go ahead and call Start.  However, if your intention was
    // to continue playing from where the user paused, you should call Resume
    // instead.
    //
    HRESULT Start( [in] QWORD cnsStart,
                   [in] QWORD cnsDuration,
                   [in] float fRate,
                   [in] void *pvContext );

    HRESULT Stop();

    HRESULT Pause();

    HRESULT Resume();
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 9397F121-7705-4dc9-B049-98B698188414 ),
    helpstring( "IWMSyncReader interface" ),
    pointer_default( unique ),
    local
]
interface IWMSyncReader : IUnknown
{
    //
    // This interface can be QI'ed for IWMProfile, IWMHeaderInfo and
    // IWMReaderTimecode interfaces
    //

    //
    // Open is an synchronous call. We do not support streaming at this time.
    // All open with http:// etc would fail. We do support MP3 or Windows
    // media files from both local file or UNC path.
    //
    HRESULT Open( [in] const WCHAR *pwszFilename );

    HRESULT Close();

    //
    // SetRange is basically a seek method, you can only set same range
    // for all streams. Use cnsDuration=0 to specify reading to end of file.
    //
    HRESULT SetRange(   [in]  QWORD     cnsStartTime,
                        [in]  LONGLONG  cnsDuration );

    //
    // SetRangeByFrame is frame-based access, the file has to be frame
    // indexed to succeeded this call. If the call is successful, all
    // streams are synchronized to the same position based on time.
    // Also use cFramesToRead=0 to specify reading to end of file.
    //
    HRESULT SetRangeByFrame(    [in]  WORD      wStreamNum,
                                [in]  QWORD     qwFrameNumber,
                                [in]  LONGLONG  cFramesToRead );

    //
    // If a valid stream number is specified, next sample from that stream
    // will be returned, pwStreamNum can be NULL in this case. Otherwise,
    // GetNextSample returns the next sample in time line (regardless of
    // which stream). The sample's stream number will be returned.
    // Time line is presentation time if no output setting is specified.
    // To get early delivery for some stream, use SetOutputSetting
    //
    HRESULT GetNextSample(  [in]  WORD           wStreamNum,
                            [out] INSSBuffer   **ppSample,
                            [out] QWORD         *pcnsSampleTime,
                            [out] QWORD         *pcnsDuration,
                            [out] DWORD         *pdwFlags,
                            [out] DWORD         *pdwOutputNum,
                            [out] WORD          *pwStreamNum );

    //
    // Stream selection methods are the same as asynchronous interface
    //
    HRESULT SetStreamsSelected( [in]  WORD                  cStreamCount,
                                [in]  WORD                 *pwStreamNumbers,
                                [in]  WMT_STREAM_SELECTION *pSelections );

    HRESULT GetStreamSelected( [in]  WORD                   wStreamNum,
                               [out] WMT_STREAM_SELECTION  *pSelection );

    HRESULT SetReadStreamSamples( [in]  WORD    wStreamNum,
                                  [in]  BOOL    fCompressed );

    HRESULT GetReadStreamSamples( [in]  WORD    wStreamNum,
                                  [out] BOOL   *pfCompressed );

    //
    // The following two methods are the same as the ones in
    // IWMReaderAdvanced2 interface. We don't support JustInTimeDecode
    // in this interface
    //
    HRESULT GetOutputSetting(   [in]     DWORD              dwOutputNum,
                                [in]     LPCWSTR            pszName,
                                [out]    WMT_ATTR_DATATYPE *pType,
                                [out, size_is( *pcbLength )]    BYTE              *pValue,
                                [in, out] WORD              *pcbLength );

    //
    // Sets a named setting for a particular output
    //
    HRESULT SetOutputSetting(   [in] DWORD              dwOutputNum,
                                [in] LPCWSTR            pszName,
                                [in] WMT_ATTR_DATATYPE  Type,
                                [in, size_is( cbLength )] const BYTE        *pValue,
                                [in] WORD               cbLength );

    //
    // The following methods are important for receiving uncompressed samples,
    // they are identical to methods in asynchronous Reader interface.
    //
    HRESULT GetOutputCount( [out] DWORD                *pcOutputs );

    HRESULT GetOutputProps( [in]  DWORD                 dwOutputNum,
                            [out] IWMOutputMediaProps **ppOutput );

    HRESULT SetOutputProps( [in]  DWORD                 dwOutputNum,
                            [in]  IWMOutputMediaProps  *pOutput );

    //
    // Used for determining all possible format types supported by this
    // output on the reader.
    //
    HRESULT GetOutputFormatCount( [in]  DWORD   dwOutputNum,
                                  [out] DWORD  *pcFormats );

    HRESULT GetOutputFormat( [in]  DWORD                    dwOutputNum,
                             [in]  DWORD                    dwFormatNum,
                             [out] IWMOutputMediaProps    **ppProps );

    //
    // Methods provided to relate output numbers with stream numbers
    //
    HRESULT GetOutputNumberForStream(   [in]  WORD      wStreamNum,
                                        [out] DWORD    *pdwOutputNum );

    HRESULT GetStreamNumberForOutput(   [in]  DWORD     dwOutputNum,
                                        [out] WORD     *pwStreamNum );

    HRESULT GetMaxOutputSampleSize( [in]  DWORD     dwOutput,
                                    [out] DWORD    *pcbMax );

    HRESULT GetMaxStreamSampleSize( [in]  WORD      wStream,
                                    [out] DWORD    *pcbMax );

    //
    // Same as IWMSyncReader::Open but takes an IStream interface pointer
    // instead of an file name to be opened. This method is typically
    // used for custom source.
    //
    HRESULT OpenStream( [in] IStream    *pStream );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( faed3d21-1b6b-4af7-8cb6-3e189bbc187b ),
    helpstring( "IWMSyncReader2 interface" ),
    pointer_default( unique ),
    local
]
interface IWMSyncReader2 : IWMSyncReader
{
    //
    // SetRangeByTimecode is timecode-based access, the file has to be timecode
    // indexed to succeeded this call. If the call is successful, all
    // streams are synchronized to the same position based on presentation
    // time.
    //
    HRESULT SetRangeByTimecode( [in] WORD wStreamNum,
                                [in] WMT_TIMECODE_EXTENSION_DATA *pStart,
                                [in] WMT_TIMECODE_EXTENSION_DATA *pEnd );

    //
    // SetRangeByFrame is frame-based access, the file has to be frame
    // indexed to succeeded this call. If the call is successful, all
    // streams are synchronized to the same position based on time.
    // Also use cFramesToRead=0 to specify reading to end of file.
    //
    HRESULT SetRangeByFrameEx(  [in]  WORD      wStreamNum,
                                [in]  QWORD     qwFrameNumber,
                                [in]  LONGLONG  cFramesToRead,
                                [out]  QWORD    *pcnsStartTime );

    //
    // The following four methods are for user buffer allocations
    //
    HRESULT SetAllocateForOutput( [in]  DWORD dwOutputNum,
                                  [in]  IWMReaderAllocatorEx *pAllocator );

    HRESULT GetAllocateForOutput( [in]  DWORD dwOutputNum,
                                  [out] IWMReaderAllocatorEx **ppAllocator );

    HRESULT SetAllocateForStream( [in]  WORD wStreamNum,
                                  [in]  IWMReaderAllocatorEx *pAllocator );

    HRESULT GetAllocateForStream( [in]  WORD dwSreamNum,
                                  [out] IWMReaderAllocatorEx **ppAllocator );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BD7-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMOutputMediaProps Interface"),
    pointer_default(unique),
    local
]
interface IWMOutputMediaProps : IWMMediaProps
{
    //
    // A Stream Group and type together uniquely identify each output. (The
    // type is on IWMMediaProps).
    //
    HRESULT GetStreamGroupName( [out, size_is( *pcchName )] WCHAR *pwszName,
                                [in, out] WORD *pcchName );

    HRESULT GetConnectionName( [out, size_is( *pcchName )] WCHAR *pwszName,
                               [in, out] WORD *pcchName );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 6d7cdc70-9888-11d3-8edc-00c04f6109cf ),
    helpstring( "IWMStatusCallback Interface"),
    pointer_default(unique),
    local
]
interface IWMStatusCallback : IUnknown
{
    //
    // The contents of pValue depends on the Status.
    //
    HRESULT OnStatus( [in] WMT_STATUS Status,
                      [in] HRESULT hr,
                      [in] WMT_ATTR_DATATYPE dwType,
                      [in] BYTE *pValue,
                      [in] void *pvContext );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BD8-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMReaderCallback Interface"),
    pointer_default(unique),
    local
]
interface IWMReaderCallback : IWMStatusCallback
{
    //
    // cnsSampleDuration will be 0 for most media types.
    //
    HRESULT OnSample( [in] DWORD dwOutputNum,
                      [in] QWORD cnsSampleTime,
                      [in] QWORD cnsSampleDuration,
                      [in] DWORD dwFlags,
                      [in] INSSBuffer *pSample,
                      [in] void *pvContext );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 342e0eb7-e651-450c-975b-2ace2c90c48e ),
    helpstring( "IWMCredentialCallback Interface"),
    pointer_default(unique),
    local
]
interface IWMCredentialCallback : IUnknown
{
    HRESULT AcquireCredentials( [in] WCHAR *pwszRealm,
                                [in] WCHAR *pwszSite,
                                [out, size_is( cchUser )] WCHAR *pwszUser,
                                [in] DWORD cchUser,
                                [out, size_is( cchPassword )] WCHAR *pwszPassword,
                                [in] DWORD cchPassword,
                                [in] HRESULT hrStatus,
                                [out] DWORD *pdwFlags );    // Combination of WMT_CREDENTIAL_FLAGS
};

///////////////////////////////////////////////////////////////////////////////
//
// The CLSID_WMMetadataEditor basic interfaces.
//
// Usage:
// 1) Call Open with a filename.
// 2) QI for IWMHeaderInfo, and use that to get and set attributes as
//    needed.
// 3) Flush() will cause any changes to be written back to disk (if possible).
// 4) Close() closes the file without writing any changes to disk.
//
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BD9-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMMetadataEditor Interface"),
    pointer_default(unique),
    local
]
interface IWMMetadataEditor : IUnknown
{
    // QI this for IWMHeaderInfo to edit the header attributes.

    //
    // Manage the file
    //
    HRESULT Open( [in] const WCHAR *pwszFilename );

    HRESULT Close();

    HRESULT Flush();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 203CFFE3-2E18-4fdf-B59D-6E71530534CF ),
    helpstring( "IWMMetadataEditor2 Interface" ),
    pointer_default(unique),
    local
]
interface IWMMetadataEditor2 : IWMMetadataEditor
{
    //
    // The flags to dwDesiredAccess and dwShareMode match the flags to
    // (the win32 API) CreateFile.
    //
    // Supported combinations are:
    //
    //   dwDesiredAccess               dwShareMode
    //   ----------------------------  -----------
    //   GENERIC_READ | GENERIC_WRITE  0
    //   GENERIC_READ | GENERIC_WRITE  FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
    //   GENERIC_READ                  0
    //   GENERIC_READ                  FILE_SHARE_READ
    //   GENERIC_READ                  FILE_SHARE_DELETE
    //   GENERIC_READ                  FILE_SHARE_READ | FILE_SHARE_DELETE
    //
    HRESULT OpenEx( [in] const WCHAR *pwszFilename,
                    [in] DWORD dwDesiredAccess,
                    [in] DWORD dwShareMode );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( FF130EBC-A6C3-42A6-B401-C3382C3E08B3 ),
    helpstring( "IWMDRMEditor Interface" ),
    pointer_default(unique),
    local
]
interface IWMDRMEditor: IUnknown
{
    //
    // For accessing DRM properties from the metadata editor.
    //

    HRESULT GetDRMProperty( [in] LPCWSTR pwstrName,
                            [out] WMT_ATTR_DATATYPE* pdwType,
                            [out, size_is( *pcbLength )] BYTE *pValue,
                            [in, out] WORD *pcbLength );
};

///////////////////////////////////////////////////////////////////////////////
//
// Below are utility interfaces used across all 3 of the main objects.
//
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BDA-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMHeaderInfo Interface"),
    pointer_default(unique),
    local
]
//
// The 3 main interface (IWMWriter, IWMReader, and
// IWMMetadataEditor) can be QI'd for this interface to get and set
// header attributes, and markers.
//
interface IWMHeaderInfo : IUnknown
{
    //
    // For attributes, the stream number passed in means:
    // -1 (0xffff) to specifies "any or no stream".
    // 0 specifies "no stream".
    // Any other value indicates the stream number.
    //
    // Windows Media version 4 and earlier does not support per stream
    // attributes, so any stream number other than 0 will fail.
    //
    HRESULT GetAttributeCount( [in] WORD wStreamNum,
                               [out] WORD *pcAttributes );

    HRESULT GetAttributeByIndex( [in] WORD wIndex,
                                 [in, out] WORD *pwStreamNum,
                                 [out, size_is( *pcchNameLen )] WCHAR *pwszName,
                                 [in, out] WORD *pcchNameLen,
                                 [out] WMT_ATTR_DATATYPE *pType,
                                 [out, size_is( *pcbLength )] BYTE *pValue,
                                 [in, out] WORD *pcbLength );

    HRESULT GetAttributeByName( [in, out] WORD *pwStreamNum,
                                [in] LPCWSTR pszName,
                                [out] WMT_ATTR_DATATYPE *pType,
                                [out, size_is( *pcbLength )] BYTE *pValue,
                                [in, out] WORD *pcbLength );

    HRESULT SetAttribute( [in] WORD wStreamNum,
                          [in] LPCWSTR pszName,
                          [in] WMT_ATTR_DATATYPE Type,
                          [in, size_is( cbLength )] const BYTE *pValue,
                          [in] WORD cbLength );

    //
    // Marker methods.
    //
    HRESULT GetMarkerCount( [out] WORD *pcMarkers );

    HRESULT GetMarker( [in] WORD wIndex,
                       [out, size_is( *pcchMarkerNameLen )] WCHAR *pwszMarkerName,
                       [in, out] WORD *pcchMarkerNameLen,
                       [out] QWORD *pcnsMarkerTime );

    HRESULT AddMarker( [in] LPCWSTR_WMSDK_TYPE_SAFE pwszMarkerName,
                       [in] QWORD cnsMarkerTime );

    HRESULT RemoveMarker( [in] WORD wIndex );

    //
    // Script command methods.
    //
    HRESULT GetScriptCount( [out] WORD *pcScripts );

    HRESULT GetScript( [in] WORD wIndex,
                       [out, size_is( *pcchTypeLen )] WCHAR *pwszType,
                       [in, out] WORD *pcchTypeLen,
                       [out, size_is( *pcchCommandLen )] WCHAR *pwszCommand,
                       [in, out] WORD *pcchCommandLen,
                       [out] QWORD *pcnsScriptTime );

    HRESULT AddScript( [in] LPCWSTR_WMSDK_TYPE_SAFE pwszType,
                       [in] LPCWSTR_WMSDK_TYPE_SAFE pwszCommand,
                       [in] QWORD cnsScriptTime );

    HRESULT RemoveScript( [in] WORD wIndex );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 15CF9781-454E-482e-B393-85FAE487A810 ),
    helpstring( "IWMHeaderInfo2 Interface"),
    pointer_default(unique),
    local
]
//
// The 3 main interface (IWMWriter, IWMReader, and
// IWMMetadataEditor) can be QI'd for this interface to get and set
// header attributes, and markers.
//
interface IWMHeaderInfo2 : IWMHeaderInfo
{
    HRESULT GetCodecInfoCount(  [out] DWORD* pcCodecInfos );

    HRESULT GetCodecInfo(       [in] DWORD   wIndex,
                                [in, out] WORD* pcchName,
                                [out, size_is( *pcchName )] WCHAR*  pwszName,
                                [in, out] WORD* pcchDescription,
                                [out, size_is( *pcchDescription )] WCHAR*  pwszDescription,
                                [out] WMT_CODEC_INFO_TYPE* pCodecType,
                                [in, out] WORD* pcbCodecInfo,
                                [out, size_is( *pcbCodecInfo )] BYTE* pbCodecInfo );
};

///////////////////////////////////////////////////////////////////////////////
//
// IWMHeaderInfo3 - V9 metadata features. This interface extends IWMHeaderInfo
// functionality:
//  - allows >64k attributes;
//  - allows multiple attributes with the same name;
//  - works with attribute languages.
//
///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 15CC68E3-27CC-4ecd-B222-3F5D02D80BD5 ),
    helpstring( "IWMHeaderInfo3 Interface"),
    pointer_default(unique),
    local
]
interface IWMHeaderInfo3 : IWMHeaderInfo2
{
    HRESULT GetAttributeCountEx(
                            [in] WORD wStreamNum,
                            [out] WORD *pcAttributes );

    HRESULT GetAttributeIndices(
                            [in] WORD wStreamNum,
                            [in] LPCWSTR pwszName,
                            [in] WORD *pwLangIndex,
                            [out, size_is( *pwCount )] WORD *pwIndices,
                            [in, out] WORD *pwCount );

   HRESULT GetAttributeByIndexEx(
                            [in] WORD wStreamNum,
                            [in] WORD wIndex,
                            [out, size_is( *pwNameLen )] LPWSTR pwszName,
                            [in, out] WORD *pwNameLen,
                            [out] WMT_ATTR_DATATYPE *pType,
                            [out] WORD *pwLangIndex,
                            [out, size_is( *pdwDataLength )] BYTE *pValue,
                            [in, out] DWORD *pdwDataLength );

    HRESULT ModifyAttribute(
                            [in] WORD wStreamNum,
                            [in] WORD wIndex,
                            [in] WMT_ATTR_DATATYPE Type,
                            [in] WORD wLangIndex,
                            [in, size_is( dwLength )] const BYTE *pValue,
                            [in] DWORD dwLength );

    HRESULT AddAttribute(
                            [in] WORD wStreamNum,
                            [in] LPCWSTR pszName,
                            [out] WORD *pwIndex,
                            [in] WMT_ATTR_DATATYPE Type,
                            [in] WORD wLangIndex,
                            [in, size_is( dwLength )] const BYTE *pValue,
                            [in] DWORD dwLength );

    HRESULT DeleteAttribute(
                            [in] WORD wStreamNum,
                            [in] WORD wIndex );

    HRESULT AddCodecInfo(
                            [in] LPCWSTR_WMSDK_TYPE_SAFE pwszName,
                            [in] LPCWSTR_WMSDK_TYPE_SAFE pwszDescription,
                            [in] WMT_CODEC_INFO_TYPE codecType,
                            [in] WORD cbCodecInfo,
                            [in, size_is( cbCodecInfo )] BYTE *pbCodecInfo );
};

///////////////////////////////////////////////////////////////////////////////
//
// The profile API. The intention is that most users don't touch the profile
// API, but just use pre-existing profiles.
//
// Profiles define authoring configurations, such as stream types, bitrates,
// etc.
//
///////////////////////////////////////////////////////////////////////////////


[
    object,
    uuid( d16679f2-6ca0-472d-8d31-2f5d55aee155 ),
    helpstring( "IWMProfileManager Interface"),
    pointer_default(unique),
    local
]
interface IWMProfileManager : IUnknown
{
    //
    // Create a profile with nothing in it.
    //
    HRESULT CreateEmptyProfile( [in] WMT_VERSION dwVersion,
                                [out] IWMProfile **ppProfile );

    //
    // Load a system profile given its ID.
    //
    HRESULT LoadProfileByID( [in] REFGUID guidProfile,
                             [out] IWMProfile **ppProfile );

    //
    // Load a profile from a stored string.
    //
    HRESULT LoadProfileByData( [in] const WCHAR *pwszProfile,
                               [out] IWMProfile **ppProfile );

    //
    // Save profile specified by its string.
    //
    HRESULT SaveProfile( [in] IWMProfile *pIWMProfile,
                         [in] WCHAR *pwszProfile,
                         [in, out] DWORD *pdwLength );

    //
    // Iterate through the system profiles.
    //
    HRESULT GetSystemProfileCount( [out] DWORD *pcProfiles );

    HRESULT LoadSystemProfile( [in] DWORD dwProfileIndex,
                               [out] IWMProfile **ppProfile );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 7A924E51-73C1-494d-8019-23D37ED9B89A ),
    helpstring( "IWMProfileManager2 Interface"),
    pointer_default(unique),
    local
]
interface IWMProfileManager2 : IWMProfileManager
{
    //
    // Set the version number of the system profiles that the profile manager
    // will enumerate. WMT_VER_4_0 is the default, for compatibility reasons,
    // so be sure to set this to the latest version if that is the desired
    // result.
    //
    HRESULT GetSystemProfileVersion( WMT_VERSION *pdwVersion );
    HRESULT SetSystemProfileVersion( WMT_VERSION dwVersion );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( BA4DCC78-7EE0-4ab8-B27A-DBCE8BC51454 ),
    helpstring( "IWMProfileManagerLanguage Interface"),
    pointer_default(unique),
    local
]
interface IWMProfileManagerLanguage : IUnknown
{
    //
    // Set the language ID that user prefers to use, it must be a valid
    // LANGID we support and the corresponding localized profile must
    // present. Or we'll use English as default
    //
    HRESULT GetUserLanguageID( WORD *wLangID );
    HRESULT SetUserLanguageID( WORD wLangID );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BDB-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMProfile Interface"),
    pointer_default(unique),
    local
]
interface IWMProfile : IUnknown
{
    //
    // By default, when the user creates a profile, it will use the latest
    // version of Windows Media. To create a backward-compatible profile,
    // call IWMProfileManager::CreateEmptyProfile with the appropriate version
    // number.
    //
    HRESULT GetVersion( [out] WMT_VERSION *pdwVersion );

    //
    // Profiles have names and descriptions, for use when displaying lists
    // of profiles, etc.
    //
    HRESULT GetName( [out, size_is( *pcchName )] WCHAR *pwszName,
                     [in, out] DWORD *pcchName );

    HRESULT SetName( [in] const WCHAR *pwszName );

    HRESULT GetDescription( [out, size_is( *pcchDescription )] WCHAR *pwszDescription,
                            [in, out] DWORD *pcchDescription );

    HRESULT SetDescription( [in] const WCHAR *pwszDescription );

    //
    // Methods for enumerating the streams. Note that updating the
    // returned IWMStreamConfig has no effect on the profile until you
    // call ReconfigStream().
    //
    HRESULT GetStreamCount( [out] DWORD *pcStreams );

    HRESULT GetStream( [in] DWORD dwStreamIndex,
                       [out] IWMStreamConfig **ppConfig );

    HRESULT GetStreamByNumber( [in] WORD wStreamNum,
                               [out] IWMStreamConfig **ppConfig );
    //
    // Remove a stream.
    //
    HRESULT RemoveStream( [in] IWMStreamConfig *pConfig );

    HRESULT RemoveStreamByNumber( [in] WORD wStreamNum );

    //
    // Adding a stream copies the config into the profile.
    //
    HRESULT AddStream( [in] IWMStreamConfig *pConfig );

    HRESULT ReconfigStream( [in] IWMStreamConfig *pConfig );

    //
    // Create a new stream config object (avoiding the need to CoCreate).
    // This will still need to be added to the profile using the AddStream()
    // call (but only after it has been configured).
    //
    HRESULT CreateNewStream( [in] REFGUID guidStreamType,
                             [out] IWMStreamConfig **ppConfig );

    //
    // Mutual Exclusion. As above, only Add and Remove actual change the
    // profile.
    //
    HRESULT GetMutualExclusionCount( [out] DWORD *pcME );

    HRESULT GetMutualExclusion( [in] DWORD dwMEIndex,
                                [out] IWMMutualExclusion **ppME );

    HRESULT RemoveMutualExclusion( [in] IWMMutualExclusion *pME );

    HRESULT AddMutualExclusion( [in] IWMMutualExclusion *pME );

    HRESULT CreateNewMutualExclusion( [out] IWMMutualExclusion **ppME );

};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 07E72D33-D94E-4be7-8843-60AE5FF7E5F5 ),
    helpstring( "IWMProfile2 Interface"),
    pointer_default(unique),
    local
]
interface IWMProfile2 : IWMProfile
{
    //
    // Get/set this profile's unique identifier
    //
    HRESULT GetProfileID( [out] GUID*       pguidID );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid(00EF96CC-A461-4546-8BCD-C9A28F0E06F5),
    helpstring("IWMProfile3 Interface"),
    pointer_default(unique),
    local
]
interface IWMProfile3 : IWMProfile2
{
    //
    // Get/set the storage format.  These calls have been deprecated.
    // Query the WM/ContainerFormat attribute instead.
    //
    HRESULT GetStorageFormat([out] WMT_STORAGE_FORMAT *pnStorageFormat);

    HRESULT SetStorageFormat([in] WMT_STORAGE_FORMAT nStorageFormat);

    //
    // Bandwidth sharing. Only Add and Remove actually change the
    // profile.
    //
    HRESULT GetBandwidthSharingCount( [out] DWORD *pcBS );

    HRESULT GetBandwidthSharing( [in] DWORD dwBSIndex,
                                [out] IWMBandwidthSharing **ppBS );

    HRESULT RemoveBandwidthSharing( [in] IWMBandwidthSharing *pBS );

    HRESULT AddBandwidthSharing( [in] IWMBandwidthSharing *pBS );

    HRESULT CreateNewBandwidthSharing( [out] IWMBandwidthSharing **ppBS );

    //
    // Stream prioritization.  Only Set and Remove actually
    // change the profile.
    // Note that there can be at most one such object.
    //
    HRESULT GetStreamPrioritization( [out] IWMStreamPrioritization **ppSP );

    HRESULT SetStreamPrioritization( [in] IWMStreamPrioritization *pSP );

    HRESULT RemoveStreamPrioritization();

    HRESULT CreateNewStreamPrioritization( [out] IWMStreamPrioritization **ppSP);

    //
    // Get information about how the muxing will be done
    //
    HRESULT GetExpectedPacketCount( [in] QWORD msDuration,
                                    [out] QWORD *pcPackets );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BDC-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMStreamConfig Interface"),
    pointer_default(unique),
    local
]
//
// IWMStreamConfig represents an ASF stream.
//
interface IWMStreamConfig : IUnknown
{
    // This interface QI's for IWMMediaProps and one of it's inheritors.
    // (IWMVideoMediaProps, for instance).

    HRESULT GetStreamType( [out] GUID *pguidStreamType );

    HRESULT GetStreamNumber( [out] WORD *pwStreamNum );

    HRESULT SetStreamNumber( [in] WORD wStreamNum );

    HRESULT GetStreamName( [out, size_is( *pcchStreamName )] WCHAR *pwszStreamName,
                           [in, out] WORD *pcchStreamName );

    HRESULT SetStreamName( [in] LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName );

    HRESULT GetConnectionName( [out, size_is( *pcchInputName )] WCHAR *pwszInputName,
                               [in, out] WORD *pcchInputName );

    HRESULT SetConnectionName( [in] LPCWSTR_WMSDK_TYPE_SAFE pwszInputName );

    HRESULT GetBitrate( [out] DWORD *pdwBitrate );

    HRESULT SetBitrate( [in] DWORD pdwBitrate );

    //
    // A buffer window of -1 (0xffffffff) indicates that the buffer window
    // is unknown. On the writer side, this means the writer can use whatever
    // buffer window it chooses.
    //
    HRESULT GetBufferWindow( [out] DWORD *pmsBufferWindow );

    HRESULT SetBufferWindow( [in] DWORD msBufferWindow );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 7688D8CB-FC0D-43BD-9459-5A8DEC200CFA ),
    helpstring( "IWMStreamConfig2 Interface"),
    pointer_default(unique),
    local
]
interface IWMStreamConfig2 : IWMStreamConfig
{
    //
    // Get/set the type of data communication protocol (reliable or unreliable)
    //
    HRESULT GetTransportType ([out] WMT_TRANSPORT_TYPE *pnTransportType);

    HRESULT SetTransportType([in] WMT_TRANSPORT_TYPE nTransportType);

    //
    // Add/Get data unit extension systems (for attaching user-defined
    // data to samples in the output file)
    //
    HRESULT AddDataUnitExtension(       [in]    GUID    guidExtensionSystemID,
                                        [in]    WORD    cbExtensionDataSize,
                                        [in, size_is( cbExtensionSystemInfo )]    BYTE    *pbExtensionSystemInfo,
                                        [in]    DWORD   cbExtensionSystemInfo );

    HRESULT GetDataUnitExtensionCount(  [out]   WORD    *pcDataUnitExtensions );

    HRESULT GetDataUnitExtension(       [in]    WORD    wDataUnitExtensionNumber,
                                        [out]   GUID    *pguidExtensionSystemID,
                                        [out]   WORD    *pcbExtensionDataSize,
                                        [out, size_is( *pcbExtensionSystemInfo )]   BYTE    *pbExtensionSystemInfo,
                                        [in, out]   DWORD   *pcbExtensionSystemInfo );

    HRESULT RemoveAllDataUnitExtensions();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( CB164104-3AA9-45a7-9AC9-4DAEE131D6E1 ),
    helpstring( "IWMStreamConfig3 Interface"),
    pointer_default(unique),
    local
]
interface IWMStreamConfig3 : IWMStreamConfig2
{
    //
    // Get/set language info for this stream as an RFC1766 string.
    //

    HRESULT GetLanguage(    [out, size_is( *pcchLanguageStringLength )]   WCHAR *pwszLanguageString,
                            [in, out] WORD *pcchLanguageStringLength );

    HRESULT SetLanguage(    [in] LPCWSTR_WMSDK_TYPE_SAFE pwszLanguageString );
}


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( CDFB97AB-188F-40b3-B643-5B7903975C59 ),
    helpstring( "IWMPacketSize Interface"),
    pointer_default(unique),
    local
]
//
// Controls how big packets can get in an ASF file.
//
interface IWMPacketSize : IUnknown
{
    HRESULT GetMaxPacketSize( [out] DWORD *pdwMaxPacketSize );

    HRESULT SetMaxPacketSize( [in]  DWORD dwMaxPacketSize );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 8BFC2B9E-B646-4233-A877-1C6A079669DC ),
    helpstring( "IWMPacketSize2 Interface"),
    pointer_default(unique),
    local
]
//
// Controls how small packets can get in an ASF file.
//
interface IWMPacketSize2 : IWMPacketSize
{
    HRESULT GetMinPacketSize(   [out] DWORD *pdwMinPacketSize );

    HRESULT SetMinPacketSize(   [in]  DWORD dwMinPacketSize );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BDD-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMStreamList Interface"),
    pointer_default(unique),
    local
]
//
// IWMStreamList is used for the various objects that define relationships
// between streams.
//
interface IWMStreamList : IUnknown
{
    HRESULT GetStreams( [out, size_is( *pcStreams )] WORD *pwStreamNumArray,
                        [in, out] WORD *pcStreams );

    HRESULT AddStream( [in] WORD wStreamNum );

    HRESULT RemoveStream( [in] WORD wStreamNum );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BDE-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMMutualExclusion Interface"),
    pointer_default(unique),
    local
]
//
// IWMMutualExclusion specifies a group of streams, of which only one can
// be played at once. These are used to do MEB (stream selection based on
// bandwidth).
//
interface IWMMutualExclusion : IWMStreamList
{
    //
    // The possible types of mutual exclusion are defined in the ASF
    // header.
    //
    HRESULT GetType( [out] GUID *pguidType );

    HRESULT SetType( [in] REFGUID guidType );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 0302B57D-89D1-4ba2-85C9-166F2C53EB91 ),
    helpstring( "IWMMutualExclusion2 interface" ),
    pointer_default(unique),
    local
]
//
// IWMMutualExclusion2 extends IWMMutualExclusion to incorporate more advanced
// mutual exclusion concepts.
//
interface IWMMutualExclusion2 : IWMMutualExclusion
{
    //
    // Methods to get and set the name of the mutual exclusion.
    //
    HRESULT GetName( [out, size_is( *pcchName )] WCHAR *pwszName,
                     [in, out] WORD *pcchName );

    HRESULT SetName( [in] LPCWSTR_WMSDK_TYPE_SAFE pwszName );

    //
    // Methods to query and manipulate the records in the object.
    //
    HRESULT GetRecordCount( [out] WORD *pwRecordCount );

    HRESULT AddRecord();

    HRESULT RemoveRecord( [in] WORD wRecordNumber );

    //
    // Methods to get and set the name associated with a record.
    //
    HRESULT GetRecordName( [in] WORD wRecordNumber,
                           [out, size_is( *pcchRecordName )] WCHAR *pwszRecordName,
                           [in, out] WORD *pcchRecordName );

    HRESULT SetRecordName( [in] WORD wRecordNumber,
                           [in] LPCWSTR_WMSDK_TYPE_SAFE pwszRecordName );

    //
    // Methods to get and set the streams in a record.
    //
    HRESULT GetStreamsForRecord( [in] WORD wRecordNumber,
                                 [out, size_is( *pcStreams )] WORD *pwStreamNumArray,
                                 [in, out] WORD *pcStreams );

    HRESULT AddStreamForRecord( [in] WORD wRecordNumber,
                                [in] WORD wStreamNumber );

    HRESULT RemoveStreamForRecord( [in] WORD wRecordNumber,
                                   [in] WORD wStreamNumber );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( AD694AF1-F8D9-42F8-BC47-70311B0C4F9E ),
    helpstring( "IWMBandwidthSharing Interface"),
    pointer_default(unique),
    local
]
//
// IWMBandwidthSharing specifies a group of streams whose combined bitrate
// and buffer size are not to exceed the parameters given to this interface,
// even though the sum of their individual bitrates may be more.
//
interface IWMBandwidthSharing : IWMStreamList
{
    //
    // The possible types of bandwidth are defined in the ASF
    // header.
    //
    HRESULT GetType( [out] GUID *pguidType );

    HRESULT SetType( [in] REFGUID guidType );

    //
    // Methods to get and set properties of the combined streams.
    // Buffer windows are given in milliseconds
    //
    HRESULT GetBandwidth(   [out] DWORD *pdwBitrate,
                            [out] DWORD *pmsBufferWindow );

    HRESULT SetBandwidth(   [in] DWORD dwBitrate,
                            [in] DWORD msBufferWindow );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 8C1C6090-F9A8-4748-8EC3-DD1108BA1E77 ),
    helpstring( "IWMStreamPrioritization Interface"),
    pointer_default(unique),
    local
]
//
// IWMStreamPrioritization specifies the author's intentions as to which
// streams should or should not be dropped in response to various network
// congestion situations.
//
interface IWMStreamPrioritization : IUnknown
{
    //
    // Records in a stream prioritization object are given in order of
    // decreasing priority
    //
    HRESULT GetPriorityRecords( [out, size_is( *pcRecords )] WM_STREAM_PRIORITY_RECORD *pRecordArray,
                                [in, out] WORD *pcRecords );

    HRESULT SetPriorityRecords( [in] WM_STREAM_PRIORITY_RECORD *pRecordArray,
                                [in] WORD cRecords );
};

///////////////////////////////////////////////////////////////////////////////
//
// Advanced features.
//
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BE3-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMWriterAdvanced Interface"),
    pointer_default(unique),
    local
]
//
// The writer can be QI'd for this interface, which provides advanced writing
// functionality.
//
interface IWMWriterAdvanced : IUnknown
{
    //
    // Sinks are where the output ASF data goes.
    //
    HRESULT GetSinkCount( [out] DWORD *pcSinks );

    HRESULT GetSink( [in] DWORD dwSinkNum,
                     [out] IWMWriterSink **ppSink );

    HRESULT AddSink( [in] IWMWriterSink *pSink );

    HRESULT RemoveSink( [in] IWMWriterSink *pSink );

    //
    // By default, the user provides samples to an input on the
    // IWMWriter interface, and the samples may be compressed, put
    // into a MEB stream, etc. However, the user can use this interface to
    // put the samples directly into the ASF, with no compression etc.
    //
    HRESULT WriteStreamSample( [in] WORD wStreamNum,
                               [in] QWORD cnsSampleTime,
                               [in] DWORD msSampleSendTime,
                               [in] QWORD cnsSampleDuration,
                               [in] DWORD dwFlags,
                               [in] INSSBuffer *pSample );

    //
    // The writer may be running in real-time. If so, it's interesting to
    // get the current time from the writer.
    //
    HRESULT SetLiveSource( BOOL fIsLiveSource );

    HRESULT IsRealTime( [out] BOOL *pfRealTime );

    HRESULT GetWriterTime( [out] QWORD *pcnsCurrentTime );

    //
    // To get statistics, pass in a WM_WRITER_STATISTICS structure, which
    // will be filled out by the GetStatistics() call with the requested
    // stats.
    //
    // Pass in a stream number to get statistics for a specific stream, or
    // pass 0 to get statistics for the entire ASF file.
    //
    HRESULT GetStatistics( [in] WORD wStreamNum,
                           [out] WM_WRITER_STATISTICS *pStats );

    //
    // Sync tolerance determines how far out of sync the inputs will be allowed
    // to get before samples are thrown away.  Default is 3000 ms.
    //
    HRESULT SetSyncTolerance(   [in]    DWORD   msWindow );
    HRESULT GetSyncTolerance(   [out]   DWORD*  pmsWindow );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 962dc1ec-c046-4db8-9cc7-26ceae500817 ),
    helpstring( "IWMWriterAdvanced2 Interface"),
    pointer_default(unique),
    local
]
//
// The writer can be QI'd for this interface, which provides advanced writing
// functionality.
//
interface IWMWriterAdvanced2 : IWMWriterAdvanced
{
    //
    // Retrieves a setting for a particular output by name
    //
    HRESULT GetInputSetting(
                    [in] DWORD dwInputNum,
                    [in] LPCWSTR pszName,
                    [out] WMT_ATTR_DATATYPE *pType,
                    [out, size_is( *pcbLength )] BYTE *pValue,
                    [in, out] WORD *pcbLength );

    //
    // Sets a named setting for a particular input
    //
    HRESULT SetInputSetting(
                    [in] DWORD dwInputNum,
                    [in] LPCWSTR pszName,
                    [in] WMT_ATTR_DATATYPE Type,
                    [in, size_is( cbLength )] const BYTE *pValue,
                    [in] WORD cbLength );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 2cd6492d-7c37-4e76-9d3b-59261183a22e ),
    helpstring( "IWMWriterAdvanced3 Interface"),
    pointer_default(unique),
    local
]
//
// The writer can be QI'd for this interface, which provides advanced writing
// functionality.
//
interface IWMWriterAdvanced3 : IWMWriterAdvanced2
{
    //
    // To get extended statistics, pass in a WM_WRITER_STATISTICS_EX structure, which
    // will be filled out by the GetStatisticsEx() call with the requested
    // stats.
    //
    // Pass in a stream number to get extended statistics for a specific stream, or
    // pass 0 to get extended statistics for the entire ASF file.
    //
    HRESULT GetStatisticsEx(
                            [in] WORD wStreamNum,
                            [out] WM_WRITER_STATISTICS_EX *pStats );
    //
    // Calling this function tells the writer not block the callers thread.
    //
    HRESULT SetNonBlocking( );

};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( fc54a285-38c4-45b5-aa23-85b9f7cb424b ),
    helpstring( "IWMWriterPreprocess Interface"),
    pointer_default(unique),
    local
]
//
// The writer can be QI'd for this interface, which provides multi-pass
// encoding functionality.
//
interface IWMWriterPreprocess : IUnknown
{
    HRESULT GetMaxPreprocessingPasses(
                                [in] DWORD dwInputNum,
                                [in] DWORD dwFlags,
                                [out] DWORD *pdwMaxNumPasses );

    HRESULT SetNumPreprocessingPasses(
                                [in] DWORD dwInputNum,
                                [in] DWORD dwFlags,
                                [in] DWORD dwNumPasses );

    HRESULT BeginPreprocessingPass(
                                [in] DWORD dwInputNum,
                                [in] DWORD dwFlags );

    HRESULT PreprocessSample(
                                [in] DWORD dwInputNum,
                                [in] QWORD cnsSampleTime,
                                [in] DWORD dwFlags,
                                [in] INSSBuffer *pSample );

    HRESULT EndPreprocessingPass(
                                [in] DWORD dwInputNum,
                                [in] DWORD dwFlags );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( D9D6549D-A193-4f24-B308-03123D9B7F8D ),
    helpstring( "IWMWriterPostViewCallback Interface"),
    pointer_default(unique),
    local
]
//
// This is the interface that receives uncompressed samples from the writer
// to preview (well, postview) what the codec is doing.
//
interface IWMWriterPostViewCallback : IWMStatusCallback
{

    //
    // cnsSampleDuration will be 0 for most media types.
    //
    HRESULT OnPostViewSample(   [in] WORD  wStreamNumber,
                                [in] QWORD cnsSampleTime,
                                [in] QWORD cnsSampleDuration,
                                [in] DWORD dwFlags,
                                [in] INSSBuffer *pSample,
                                [in] void *pvContext );

    HRESULT AllocateForPostView([in] WORD wStreamNum,
                                [in] DWORD cbBuffer,
                                [out] INSSBuffer **ppBuffer,
                                [in] void *pvContext );

};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 81E20CE4-75EF-491a-8004-FC53C45BDC3E ),
    helpstring( "IWMWriterPostView Interface"),
    pointer_default(unique),
    local
]
//
// The writer can be QI'd for this interface, which provides advanced writing
// functionality.
//
interface IWMWriterPostView : IUnknown
{
    //
    // Specify the callback to use for PostView
    //
    HRESULT SetPostViewCallback( IWMWriterPostViewCallback*  pCallback, void* pvContext );

    //
    // Turns on delivery of postview samples for a given stream
    //
    HRESULT SetReceivePostViewSamples(  [in] WORD wStreamNum,
                                        [in] BOOL fReceivePostViewSamples );

    HRESULT GetReceivePostViewSamples(  [in] WORD wStreamNum,
                                        [out] BOOL *pfReceivePostViewSamples );

    //
    // The user can enumerate through the various outputs, and get the
    // output format for that data.
    //
    // Manipulating the IWMOutputMediaProps has no effect on the output, unless
    // the user also calls SetOutputProps.
    //
    HRESULT GetPostViewProps(   [in] WORD wStreamNumber,
                                [out] IWMMediaProps **ppOutput );

    HRESULT SetPostViewProps(   [in] WORD wStreamNumber,
                                [in] IWMMediaProps *pOutput );

    //
    // Used for determining all possible format types supported by this
    // output on the reader.
    //
    HRESULT GetPostViewFormatCount( [in]  WORD wStreamNumber,
                                    [out] DWORD *pcFormats );

    HRESULT GetPostViewFormat(  [in] WORD  wStreamNumber,
                                [in] DWORD dwFormatNumber,
                                [out] IWMMediaProps** ppProps );

    //
    // The user can register himself to provide buffers for any of the outputs
    // (for instance, DDraw buffers). The actual allocation is on the
    // IWMReaderCallbackAdvanced interface.
    //
    HRESULT SetAllocateForPostView( [in] WORD wStreamNumber,
                                    [in] BOOL fAllocate );

    HRESULT GetAllocateForPostView( [in]  WORD wStreamNumber,
                                    [out] BOOL *pfAllocate );

};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BE4-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMWriterSink Interface"),
    pointer_default(unique),
    local
]
//
// This is the interface that receives raw ASF from the writer.
//
interface IWMWriterSink : IUnknown
{
    HRESULT OnHeader( [in] INSSBuffer *pHeader );

    //
    // Some sinks require that data be fed to them in real-time.
    //
    HRESULT IsRealTime( [out] BOOL *pfRealTime );

    HRESULT AllocateDataUnit( [in] DWORD cbDataUnit,
                              [out] INSSBuffer **ppDataUnit );

    HRESULT OnDataUnit( [in] INSSBuffer *pDataUnit );

    //
    // This function is called when the writer is done sending data.
    //
    HRESULT OnEndWriting();
};



///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( CF4B1F99-4DE2-4e49-A363-252740D99BC1 ),
    helpstring( "IWMRegisterCallback Interface"),
    pointer_default(unique),
    local
]
interface IWMRegisterCallback : IUnknown
{
    HRESULT Advise( [in]    IWMStatusCallback*  pCallback,
                    [in]    void*               pvContext );

    HRESULT Unadvise( [in]  IWMStatusCallback*  pCallback,
                    [in]    void*               pvContext );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BE5-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMWriterFileSink Interface"),
    pointer_default(unique),
    local
]
interface IWMWriterFileSink : IWMWriterSink
{
    HRESULT Open( [in] const WCHAR *pwszFilename );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 14282BA7-4AEF-4205-8CE5-C229035A05BC ),
    helpstring( "IWMWriterFileSink2 Interface"),
    pointer_default(unique),
    local
]
interface IWMWriterFileSink2 : IWMWriterFileSink
{
    HRESULT Start(  [in]    QWORD cnsStartTime );

    HRESULT Stop(   [in]    QWORD cnsStopTime );

    HRESULT IsStopped(       [out] BOOL *pfStopped );

    HRESULT GetFileDuration( [out] QWORD *pcnsDuration );

    HRESULT GetFileSize(     [out] QWORD *pcbFile );

    HRESULT Close();

    HRESULT IsClosed(        [out] BOOL *pfClosed );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 3FEA4FEB-2945-47A7-A1DD-C53A8FC4C45C ),
    helpstring( "IWMWriterFileSink3 Interface"),
    pointer_default(unique),
    local
]
interface IWMWriterFileSink3 : IWMWriterFileSink2
{
    HRESULT SetAutoIndexing(    [in]    BOOL fDoAutoIndexing );

    HRESULT GetAutoIndexing(    [out]   BOOL *pfAutoIndexing );

    HRESULT SetControlStream(   [in]    WORD wStreamNumber,
                                [in]    BOOL fShouldControlStartAndStop );

    HRESULT GetMode(            [out]   DWORD *pdwFileSinkMode );

    HRESULT OnDataUnitEx(       [in]    WMT_FILESINK_DATA_UNIT *pFileSinkDataUnit );

    HRESULT SetUnbufferedIO(    [in]    BOOL fUnbufferedIO,
                                [in]    BOOL fRestrictMemUsage );

    HRESULT GetUnbufferedIO(    [out]   BOOL *pfUnbufferedIO );

    HRESULT CompleteOperations( );
}

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BE7-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMWriterNetworkSink Interface"),
    pointer_default(unique),
    local
]
interface IWMWriterNetworkSink : IWMWriterSink
{
    //
    // Determine the maximum number of clients that can connect to this sink.
    // Default is 5.
    //
    HRESULT SetMaximumClients( [in] DWORD dwMaxClients );

    HRESULT GetMaximumClients( [out] DWORD *pdwMaxClients );

    //
    // The network protocol that the network sink will use.
    //
    HRESULT SetNetworkProtocol( [in] WMT_NET_PROTOCOL protocol );

    HRESULT GetNetworkProtocol( [out] WMT_NET_PROTOCOL *pProtocol );

    //
    // Find out the name of the URL on which we're broadcasting
    //
    HRESULT GetHostURL( [out] WCHAR *pwszURL,
                        [in, out] DWORD *pcchURL );

    //
    // The method claims the network port number. Close the sink to release
    // the port.
    //
    // Specify 0 for the port number and the sink will select a port for
    // the user.
    //
    HRESULT Open( [in, out] DWORD *pdwPortNum );

    //
    // Disconnect all connected clients.
    //
    HRESULT Disconnect();

    //
    // Close and release the open port.
    //
    HRESULT Close();
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 73C66010-A299-41df-B1F0-CCF03B09C1C6 ),
    helpstring( "IWMClientConnections Interface"),
    pointer_default(unique),
    local
]
interface IWMClientConnections : IUnknown
{
    //
    // Determine the number of connected clients
    //
    HRESULT GetClientCount( [out] DWORD* pcClients );

    //
    // Get information about a connected client
    //
    HRESULT GetClientProperties( [in] DWORD dwClientNum,
                                 [out] WM_CLIENT_PROPERTIES *pClientProperties );

};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 4091571e-4701-4593-bb3d-d5f5f0c74246 ),
    helpstring( "IWMClientConnections2 Interface"),
    pointer_default(unique),
    local
]
interface IWMClientConnections2 : IWMClientConnections
{
    //
    // Get information about a connected client
    //
    HRESULT GetClientInfo( [in] DWORD dwClientNum,
                           [out, size_is( *pcchNetworkAddress )] WCHAR *pwszNetworkAddress,
                           [in, out] DWORD *pcchNetworkAddress,
                           [out, size_is( *pcchPort )] WCHAR *pwszPort,
                           [in, out] DWORD *pcchPort,
                           [out, size_is( *pcchDNSName )] WCHAR *pwszDNSName,
                           [in, out] DWORD *pcchDNSName
                           );
};



///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BEA-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMReaderAdvanced Interface"),
    pointer_default(unique),
    local
]
//
// The reader can be QI'd for this interface for advanced functionality.
//
interface IWMReaderAdvanced : IUnknown
{
    //
    // The user may want to drive the clock himself, particularly if he wants
    // to source from a file faster-than-realtime. This call may fail if the
    // current source does not support user-driven clocks.
    //
    // The proper way for a user to drive the clock is for the user to call
    // DeliverTime, and then wait for the OnTime call on
    // IWMReaderCallbackAdvanced to reach the time he specified.
    //
    HRESULT SetUserProvidedClock( [in] BOOL fUserClock );

    HRESULT GetUserProvidedClock( [out] BOOL *pfUserClock );

    HRESULT DeliverTime( [in] QWORD cnsTime );

    //
    // The user can select streams manually, instead of relying on the
    // automatic bandwidth stream selection that the reader will
    // normally do. To figure out what streams are in this ASF and what their
    // numbers are, QI for IWMProfile.
    //
    // When SetManualStreamSelection( TRUE ) is called, all streams are
    // selected by default.
    //
    HRESULT SetManualStreamSelection( [in] BOOL fSelection );

    HRESULT GetManualStreamSelection( [out] BOOL *pfSelection );

    HRESULT SetStreamsSelected( [in] WORD cStreamCount,
                                [in] WORD *pwStreamNumbers,
                                [in] WMT_STREAM_SELECTION *pSelections );

    HRESULT GetStreamSelected( [in] WORD wStreamNum,
                               [out] WMT_STREAM_SELECTION *pSelection );

    //
    // The user can also choose to get callbacks when automatic stream
    // selection occurs.
    //
    HRESULT SetReceiveSelectionCallbacks( [in] BOOL fGetCallbacks );

    HRESULT GetReceiveSelectionCallbacks( [out] BOOL *pfGetCallbacks );

    //
    // The user can register himself to receive samples directly from the
    // ASF streams, rather than letting the Reader decompress them. Note that
    // to do this, the IWMReaderCallback (supplied by the user) must support
    // IWMReaderCallbackAdvanced.
    //
    // To get actual information about the contents of a stream, QI the
    // object for IWMProfile.
    //
    HRESULT SetReceiveStreamSamples( [in] WORD wStreamNum,
                                     [in] BOOL fReceiveStreamSamples );

    HRESULT GetReceiveStreamSamples( [in] WORD wStreamNum,
                                     [out] BOOL *pfReceiveStreamSamples );

    //
    // The user can register himself to provide buffers for any of the outputs
    // (for instance, DDraw buffers). The actual allocation is on the
    // IWMReaderCallbackAdvanced interface.
    //
    HRESULT SetAllocateForOutput( [in] DWORD dwOutputNum,
                                  [in] BOOL fAllocate );

    HRESULT GetAllocateForOutput( [in] DWORD dwOutputNum,
                                  [out] BOOL *pfAllocate );

    HRESULT SetAllocateForStream( [in] WORD wStreamNum,
                                  [in] BOOL fAllocate );

    HRESULT GetAllocateForStream( [in] WORD dwSreamNum,
                                  [out] BOOL *pfAllocate );

    //
    // Get statistics on demand
    //
    HRESULT GetStatistics( [in, out] WM_READER_STATISTICS *pStatistics );

    //
    // Set client side information used for logging
    //
    HRESULT SetClientInfo( [in] WM_READER_CLIENTINFO *pClientInfo );

    //
    // Get the maximum required buffer sizes that the SDK will allocate.
    // The first is for output buffers, the second for stream buffers.
    //
    HRESULT GetMaxOutputSampleSize( [in] DWORD dwOutput,
                                    [out] DWORD *pcbMax );

    HRESULT GetMaxStreamSampleSize( [in] WORD wStream,
                                    [out] DWORD *pcbMax );

    //
    // Used to notify the reader that it's delivering data
    // too slowly to the client.  The reader will try to speed
    // up.
    //
    HRESULT NotifyLateDelivery( QWORD cnsLateness );

};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( ae14a945-b90c-4d0d-9127-80d665f7d73e ),
    helpstring( "IWMReaderAdvanced2 Interface"),
    pointer_default(unique),
    local
]
//
// The reader can be QI'd for this interface for advanced functionality.
//
interface IWMReaderAdvanced2 : IWMReaderAdvanced
{
    //
    // Set the play mode to WMT_PLAY_MODE_AUTOSELECT to allow the reader
    // to pick the mode. (This is the default). If you select a play mode that
    // is impossible for the requested URL, an error will be returned when
    // the URL is opened.
    //
    HRESULT SetPlayMode( [in] WMT_PLAY_MODE Mode );

    //
    // Get the current play mode.
    //
    HRESULT GetPlayMode( [out] WMT_PLAY_MODE *pMode );

    //
    // Between WMT_BUFFERING_START and WMT_BUFFERING_STOP this call will
    // return progress values. pdwPercent returns the percentage of buffering
    // that has completed, and pcnsBuffering returns the amount of buffering
    // remaining.
    //
    HRESULT GetBufferProgress( [out] DWORD *pdwPercent,
                               [out] QWORD *pcnsBuffering );

    //
    // When the play mode is WMT_PLAY_MODE_DOWNLOAD, this call will return
    // progress values. pdwPercent returns the percentage of the download
    // that has completed, pqwBytesDownloaded returns the number of bytes
    // that have been downloaded, and pcnsDownload returns the amount of
    // downloading remaining.
    //
    HRESULT GetDownloadProgress( [out] DWORD *pdwPercent,
                                 [out] QWORD *pqwBytesDownloaded,
                                 [out] QWORD *pcnsDownload );

    //
    // When saving a file, the operation may take awhile. Between
    // WMT_SAVEAS_START and WMT_SAVEAS_STOP, this call will return progress
    // values. pdwPercent returns the percentage of the save as that has
    // completed.
    //
    HRESULT GetSaveAsProgress( [out] DWORD *pdwPercent );

    //
    // Save the current file. This only works for WMT_PLAY_MODE_DOWNLOAD.
    // This operation is asynchronous; WMT_SAVEAS_STOP indicates that the
    // save has completed. Closing the reader will abort a save operation
    // that has not completed.
    //
    HRESULT SaveFileAs( [in] const WCHAR *pwszFilename );

    //
    // Returns the name of the protocol that is currently being used.
    // The protocol name is a URL scheme, such as "mmsu", "http", "file", etc.
    // Note, however, that the protocol name may differ from the URL scheme
    // that was specified in IWMReader::Open().
    // This method may return an empty string if the protocol name cannot be determined.
    //
    HRESULT GetProtocolName( [out, size_is( *pcchProtocol )] WCHAR *pwszProtocol,
                             [in, out] DWORD *pcchProtocol );

    //
    // Same as IWMReader::Start, but uses a marker index instead of a time value.
    //
    HRESULT StartAtMarker( [in] WORD wMarkerIndex,
                           [in] QWORD cnsDuration,
                           [in] float fRate,
                           [in] void *pvContext );

    //
    // Retrieves a setting for a particular output by name
    //
    HRESULT GetOutputSetting(
                    [in] DWORD dwOutputNum,
                    [in] LPCWSTR pszName,
                    [out] WMT_ATTR_DATATYPE *pType,
                    [out, size_is( *pcbLength )] BYTE *pValue,
                    [in, out] WORD *pcbLength );

    //
    // Sets a named setting for a particular output
    //
    HRESULT SetOutputSetting(
                    [in] DWORD dwOutputNum,
                    [in] LPCWSTR pszName,
                    [in] WMT_ATTR_DATATYPE Type,
                    [in, size_is( cbLength )] const BYTE *pValue,
                    [in] WORD cbLength );

    //
    // Used to begin prerolling the reader.  Call this method
    // when you know you're going to call Start soon and want
    // to start buffering data in advance.  cnsStart, cnsDuration
    // and fRate should be the same as the values you plan to pass
    // to Start in the future.
    //
    HRESULT Preroll(
                [in] QWORD cnsStart,
                [in] QWORD cnsDuration,
                [in] float fRate );

    //
    // Specifies whether the SDK should send the client's unique identifier
    // to the server when streaming.
    //
    HRESULT SetLogClientID( [in] BOOL fLogClientID );

    HRESULT GetLogClientID( [out] BOOL *pfLogClientID );

    //
    // This method requests that the Reader send WMT_BUFFERING_STOP as soon
    // as possible. The Reader will only honor the request if it is currently
    // buffering, i.e., it has sent a WMT_BUFFERING_START, but not yet sent the
    // corresponding WMT_BUFFERING_STOP.
    //
    HRESULT StopBuffering( );

    //
    // Same as IWMReader::Open but takes an IStream interface pointer instead
    // of an URL to be opened
    //
    HRESULT OpenStream( [in] IStream *pStream,
                        [in] IWMReaderCallback *pCallback,
                        [in] void *pvContext );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 5DC0674B-F04B-4a4e-9F2A-B1AFDE2C8100 ),
    helpstring( "IWMReaderAdvanced3 Interface" ),
    pointer_default(unique),
    local
]
//
// The reader can be QI'ed for this interface for frame access functionality.
//
interface IWMReaderAdvanced3 : IWMReaderAdvanced2
{
    //
    // This method is used when you want to stop net streaming right away but
    // continue to receive samples that SDK have gotten so far.
    //
    // If it's successful, user should receive an END_OF_STREAMING quickly.
    //
    HRESULT StopNetStreaming( );

    //
    // This method supports extended start functionality. The currently
    // support start formats are:
    //
    // WMT_OFFSET_FORMAT_100NS
    // WMT_OFFSET_FORMAT_FRAME_NUMBERS
    // WMT_OFFSET_FORMAT_PLAYLIST_OFFSET
    // WMT_OFFSET_FORMAT_TIMECODE
    //

    HRESULT StartAtPosition(  [in] WORD              wStreamNum,
                              [in] void              *pvOffsetStart,
                              [in] void              *pvDuration,
                              [in] WMT_OFFSET_FORMAT dwOffsetFormat,
                              [in] float             fRate,
                              [in] void              *pvContext );

};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 945A76A2-12AE-4d48-BD3C-CD1D90399B85 ),
    helpstring( "IWMReaderAdvanced4 Interface" ),
    pointer_default(unique),
    local
]
//
// The reader can be QI'ed for this interface for frame access functionality.
//
interface IWMReaderAdvanced4 : IWMReaderAdvanced3
{
    HRESULT GetLanguageCount(
                [in] DWORD dwOutputNum,
                [out] WORD *pwLanguageCount );

    HRESULT GetLanguage(
                [in] DWORD dwOutputNum,
                [in] WORD wLanguage,
                [out, size_is( *pcchLanguageStringLength )] WCHAR *pwszLanguageString,
                [in, out] WORD *pcchLanguageStringLength );

    HRESULT GetMaxSpeedFactor(
                [out] double *pdblFactor );

    HRESULT IsUsingFastCache(
                [out] BOOL  *pfUsingFastCache );

    HRESULT AddLogParam(
                [in] LPCWSTR wszNameSpace,
                [in] LPCWSTR wszName,
                [in] LPCWSTR wszValue );

    HRESULT SendLogParams( );

    //
    // Sets output parameter to TRUE if IWMReaderAdvanced2::SaveFileAs() is
    // can be invoked for the current content.
    //
    HRESULT CanSaveFileAs( [out] BOOL *pfCanSave );

    //
    // Cancels the current FileSaveAs operation
    //
    HRESULT CancelSaveFileAs( );

    //
    // This method returns the URL currently being played.  This URL might be
    // different from the URL passed in to IWMReader::Open, because the Reader
    // may have been redirected to an alternate URL.
    //
    HRESULT GetURL( [out, size_is( *pcchURL )] WCHAR *pwszURL,
                    [in, out] DWORD *pcchURL );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 24C44DB0-55D1-49ae-A5CC-F13815E36363 ),
    helpstring( "IWMReaderAdvanced5 Interface" ),
    pointer_default(unique),
    local
]
//
// Implemeted by FSDK for DXVA support
//
interface IWMReaderAdvanced5 : IWMReaderAdvanced4
{
    HRESULT SetPlayerHook(
                [in] DWORD         dwOutputNum,
                [in] IWMPlayerHook *pHook );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 18A2E7F8-428F-4acd-8A00-E64639BC93DE ),
    helpstring( "IWMReaderAdvanced6 Interface" ),
    pointer_default(unique),
    local
]
//
// The reader can be QI'ed for this interface for sample protection functionality.
//
interface IWMReaderAdvanced6 : IWMReaderAdvanced5
{
    HRESULT SetProtectStreamSamples( [in, size_is( cbCertificate )]  BYTE *pbCertificate,
                                     [in]  DWORD cbCertificate,
                                     [in]  DWORD dwCertificateType,
                                     [in]  DWORD dwFlags,
                                     [out, size_is( *pcbInitializationVector )] BYTE *pbInitializationVector,
                                     [in, out] DWORD *pcbInitializationVector );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( e5b7ca9a-0f1c-4f66-9002-74ec50d8b304 ),
    helpstring( "IWMPlayerHook Interface" ),
    pointer_default(unique),
    local
]
//
// Implemented by the player
//
interface IWMPlayerHook : IUnknown
{
    HRESULT PreDecode();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 9F762FA7-A22E-428d-93C9-AC82F3AAFE5A ),
    helpstring( "IWMReaderAllocatorEx Interface"),
    pointer_default(unique),
    local
]
interface IWMReaderAllocatorEx : IUnknown
{
    HRESULT AllocateForStreamEx( [in] WORD wStreamNum,
                                 [in] DWORD cbBuffer,
                                 [out] INSSBuffer **ppBuffer,
                                 [in] DWORD dwFlags,
                                 [in] QWORD cnsSampleTime,
                                 [in] QWORD cnsSampleDuration,
                                 [in] void *pvContext );

    HRESULT AllocateForOutputEx( [in] DWORD dwOutputNum,
                                 [in] DWORD cbBuffer,
                                 [out] INSSBuffer **ppBuffer,
                                 [in] DWORD dwFlags,
                                 [in] QWORD cnsSampleTime,
                                 [in] QWORD cnsSampleDuration,
                                 [in] void *pvContext );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( FDBE5592-81A1-41ea-93BD-735CAD1ADC05 ),
    helpstring( "IWMReaderTypeNegotiation Interface"),
    pointer_default(unique),
    local
]
interface IWMReaderTypeNegotiation : IUnknown
{
    HRESULT TryOutputProps( [in] DWORD dwOutputNum,
                            [in] IWMOutputMediaProps *pOutput );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BEB-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMReaderCallbackAdvanced Interface"),
    pointer_default(unique),
    local
]
//
// For some advanced functionality, the IWMReaderCallback must support this
// interface.
//
interface IWMReaderCallbackAdvanced : IUnknown
{
    //
    // Receive a sample directly from the ASF. To get this call, the user
    // must register himself to receive samples for a particular stream.
    //
    HRESULT OnStreamSample( [in] WORD wStreamNum,
                            [in] QWORD cnsSampleTime,
                            [in] QWORD cnsSampleDuration,
                            [in] DWORD dwFlags,
                            [in] INSSBuffer *pSample,
                            [in] void *pvContext );

    //
    // In some cases, the user may want to get callbacks telling what the
    // reader thinks the current time is. This is interesting in 2 cases:
    // - If the ASF has gaps in it; say no audio for 10 seconds. This call
    //   will continue to be called, while OnSample won't be called.
    // - If the user is driving the clock, the reader needs to communicate
    //   back to the user its time, to avoid the user overrunning the reader.
    //
    HRESULT OnTime( [in] QWORD cnsCurrentTime,
                    [in] void *pvContext );

    //
    // The user can also get callbacks when stream selection occurs.
    //
    HRESULT OnStreamSelection( [in] WORD wStreamCount,
                               [in] WORD *pStreamNumbers,
                               [in] WMT_STREAM_SELECTION *pSelections,
                               [in] void *pvContext );


    //
    // Will be called if the user got an async result from their
    // call to SetOutputProps.  The next sample you receive for
    // this output will have these properties.  The contents of the
    // media type after calling SetOutputProps and before receiving
    // an OutputPropsChanged notification are undefined.
    //
    HRESULT OnOutputPropsChanged( [in] DWORD dwOutputNum,
                                  [in] WM_MEDIA_TYPE *pMediaType,
                                  [in] void *pvContext );

    //
    // If the user has registered to allocate buffers, this is where he must
    // do it.
    //
    HRESULT AllocateForStream( [in] WORD wStreamNum,
                               [in] DWORD cbBuffer,
                               [out] INSSBuffer **ppBuffer,
                               [in] void *pvContext );

    HRESULT AllocateForOutput( [in] DWORD dwOutputNum,
                               [in] DWORD cbBuffer,
                               [out] INSSBuffer **ppBuffer,
                               [in] void *pvContext );
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( D2827540-3EE7-432c-B14C-DC17F085D3B3 ),
    helpstring( "IWMDRMReader Interface"),
    pointer_default(unique),
    local
]
//
// Used to access advanced DRM functionality.
//
interface IWMDRMReader : IUnknown
{
    HRESULT AcquireLicense( [in]    DWORD   dwFlags );
    HRESULT CancelLicenseAcquisition();

    HRESULT Individualize( [in]     DWORD   dwFlags );
    HRESULT CancelIndividualization();

    HRESULT MonitorLicenseAcquisition();
    HRESULT CancelMonitorLicenseAcquisition();

    HRESULT SetDRMProperty( [in]    LPCWSTR pwstrName,
                            [in]    WMT_ATTR_DATATYPE dwType,
                            [in, size_is( cbLength )]    const BYTE *pValue,
                            [in]    WORD cbLength );
    HRESULT GetDRMProperty( [in]    LPCWSTR pwstrName,
                            [out]   WMT_ATTR_DATATYPE* pdwType,
                            [out, size_is( *pcbLength )]   BYTE *pValue,
                            [in, out]   WORD *pcbLength );
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( befe7a75-9f1d-4075-b9d9-a3c37bda49a0 ),
    helpstring( "IWMDRMReader2 Interface"),
    pointer_default(unique),
    local
]
//
// Used to access advanced DRM functionality.
//
interface IWMDRMReader2 : IWMDRMReader
{
    HRESULT SetEvaluateOutputLevelLicenses( [in] BOOL fEvaluate );
    HRESULT GetPlayOutputLevels(
        [out, size_is( *pcbLength )] DRM_PLAY_OPL *pPlayOPL,
        [in, out] DWORD *pcbLength,
        [out] DWORD *pdwMinAppComplianceLevel );
    HRESULT GetCopyOutputLevels(
        [out, size_is( *pcbLength )] DRM_COPY_OPL *pCopyOPL,
        [in, out] DWORD *pcbLength,
        [out] DWORD *pdwMinAppComplianceLevel );
    HRESULT TryNextLicense();
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( e08672de-f1e7-4ff4-a0a3-fc4b08e4caf8 ),
    helpstring( "IWMDRMReader3 Interface"),
    pointer_default(unique),
    local
]
//
// Used to access advanced DRM functionality.
//
interface IWMDRMReader3 : IWMDRMReader2
{
    //
    //  An array of GUIDs will be allocated and returned to the caller.  This should be freed with CoTaskMemFree.
    //
    HRESULT GetInclusionList( [out] GUID **ppGuids, [out] DWORD *pcGuids );
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( f28c0300-9baa-4477-a846-1744d9cbf533 ),
    helpstring( "IWMReaderPlaylistBurn Interface"),
    pointer_default(unique),
    local
]
interface IWMReaderPlaylistBurn : IUnknown
{
    HRESULT InitPlaylistBurn( [in] DWORD cFiles,
                              [in] LPCWSTR_WMSDK_TYPE_SAFE *ppwszFilenames,
                              [in] IWMStatusCallback *pCallback,
                              [in] void *pvContext );
    HRESULT GetInitResults( [in] DWORD cFiles,
                            [out] HRESULT *phrStati );
    HRESULT Cancel();
    HRESULT EndPlaylistBurn( [in] HRESULT hrBurnResult );
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( 96406BEC-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMReaderNetworkConfig Interface"),
    pointer_default(unique),
    local
]
//
// Used to configure the network.  This interface is implemented by
// the IWMReader object.
//
interface IWMReaderNetworkConfig : IUnknown
{
    //
    // Get and set the amount of time the network source will buffer
    // data before rendering it.
    //
    HRESULT GetBufferingTime( [out] QWORD *pcnsBufferingTime );

    HRESULT SetBufferingTime( [in] QWORD cnsBufferingTime );

    //
    // Returns the UDP port number ranges that will be used for receiving
    // data.  If no ranges are available, random UDP port numbers will be used.
    //
    HRESULT GetUDPPortRanges( [out, size_is( *pcRanges )] WM_PORT_NUMBER_RANGE *pRangeArray,
                              [in, out] DWORD *pcRanges );

    //
    // Sets the UDP port number ranges that can be used for receiving data.
    // If no ranges are specified, random UDP port numbers will be used.
    //
    HRESULT SetUDPPortRanges( [in, size_is( cRanges )] WM_PORT_NUMBER_RANGE *pRangeArray,
                              [in] DWORD cRanges );


    //
    // Proxy settings: Manual proxy, Autodetect, UseBrowser (only for HTTP), or No Proxy.
    //
    HRESULT GetProxySettings( [in] LPCWSTR pwszProtocol,
                              [out] WMT_PROXY_SETTINGS *pProxySetting );

    HRESULT SetProxySettings( [in] LPCWSTR pwszProtocol,
                              [in] WMT_PROXY_SETTINGS ProxySetting );

    //
    // The host to use as the proxy.
    //
    HRESULT GetProxyHostName( [in] LPCWSTR pwszProtocol,
                              [out, size_is( *pcchHostName )] WCHAR *pwszHostName,
                              [in, out] DWORD *pcchHostName );

    HRESULT SetProxyHostName( [in] LPCWSTR pwszProtocol,
                              [in] LPCWSTR pwszHostName );

    //
    // The port to use as the proxy.
    //
    HRESULT GetProxyPort( [in] LPCWSTR pwszProtocol,
                          [out] DWORD *pdwPort );

    HRESULT SetProxyPort( [in] LPCWSTR pwszProtocol,
                          [in] DWORD dwPort );

    //
    // Get and set the proxy exception list.
    //
    HRESULT GetProxyExceptionList( [in] LPCWSTR pwszProtocol,
                                   [out, size_is( *pcchExceptionList )] WCHAR *pwszExceptionList,
                                   [in, out] DWORD *pcchExceptionList );

    HRESULT SetProxyExceptionList( [in] LPCWSTR pwszProtocol,
                                   [in] LPCWSTR pwszExceptionList );

    //
    // Whether or not to bypass proxy for local hosts
    //
    HRESULT GetProxyBypassForLocal( [in] LPCWSTR pwszProtocol,
                                    [out] BOOL *pfBypassForLocal );

    HRESULT SetProxyBypassForLocal( [in] LPCWSTR pwszProtocol,
                                    [in] BOOL fBypassForLocal );

    //
    // Whether to force a wpad discovery on the next run
    //
    HRESULT GetForceRerunAutoProxyDetection( [out] BOOL *pfForceRerunDetection );

    HRESULT SetForceRerunAutoProxyDetection( [in] BOOL fForceRerunDetection );

    //
    // Whether or not to use multicast, http, tcp, or udp
    //
    HRESULT GetEnableMulticast( [out] BOOL *pfEnableMulticast );

    HRESULT SetEnableMulticast( [in] BOOL fEnableMulticast );

    HRESULT GetEnableHTTP( [out] BOOL *pfEnableHTTP );

    HRESULT SetEnableHTTP( [in] BOOL fEnableHTTP );

    HRESULT GetEnableUDP( [out] BOOL *pfEnableUDP );

    HRESULT SetEnableUDP( [in] BOOL fEnableUDP );

    HRESULT GetEnableTCP( [out] BOOL *pfEnableTCP );

    HRESULT SetEnableTCP( [in] BOOL fEnableTCP );

    //
    // Forgets automatic protocol detection settings and redetects next time.
    //
    HRESULT ResetProtocolRollover( );

    //
    // Return or set the client's link bandwidth in bps.  This is an optional
    // setting.  By default, the SDK will automatically detect its connection
    // bandwidth to the streaming media server.
    //
    HRESULT GetConnectionBandwidth( [out] DWORD *pdwConnectionBandwidth );

    HRESULT SetConnectionBandwidth( [in] DWORD dwConnectionBandwidth );

    //
    // Iterate through the network protocols supported by this reader
    //
    HRESULT GetNumProtocolsSupported( [out] DWORD *pcProtocols );

    HRESULT GetSupportedProtocolName( [in]  DWORD dwProtocolNum,
                                      [out, size_is( *pcchProtocolName )] WCHAR *pwszProtocolName,
                                      [in, out] DWORD *pcchProtocolName);


    //
    // Adds the specified pszUrl to the list of URL's to recieve logging data.
    // This list is in addition to the origin server.
    //
    HRESULT AddLoggingUrl( [in] LPCWSTR pwszUrl );

    //
    // Fills the buffer with the URL corresponding to index dwIndex.
    //
    HRESULT GetLoggingUrl( [in] DWORD dwIndex,
                           [out, size_is( *pcchUrl )] LPWSTR pwszUrl,
                           [in, out] DWORD *pcchUrl );

    //
    // Returns the number of URLs in the current list of logging URLs.
    //
    HRESULT GetLoggingUrlCount( [out] DWORD *pdwUrlCount );

    //
    // Clears the list of logging URLs
    //
    HRESULT ResetLoggingUrlList( );

}

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( d979a853-042b-4050-8387-c939db22013f ),
    helpstring( "IWMReaderNetworkConfig2 Interface"),
    pointer_default(unique),
    local
]
//
// Used to configure the network.  This interface is implemented by
// the IWMReader object.
//
interface IWMReaderNetworkConfig2 : IWMReaderNetworkConfig
{
    //
    // If enabled, allows streaming content (WMT_PLAY_MODE_STREAMING)
    // to be cached locally.
    //
    HRESULT GetEnableContentCaching( [out] BOOL *pfEnableContentCaching );

    HRESULT SetEnableContentCaching( [in] BOOL fEnableContentCaching );

    //
    // If enabled, allows streaming content to be streamed at a rate higher
    // than the playback rate.  This feature requires ContentCaching to be
    // enabled as well.
    //
    HRESULT GetEnableFastCache( [out] BOOL *pfEnableFastCache );

    HRESULT SetEnableFastCache( [in] BOOL fEnableFastCache );

    HRESULT GetAcceleratedStreamingDuration( [out] QWORD *pcnsAccelDuration );

    HRESULT SetAcceleratedStreamingDuration( [in] QWORD cnsAccelDuration );

    HRESULT GetAutoReconnectLimit( [out] DWORD *pdwAutoReconnectLimit );

    HRESULT SetAutoReconnectLimit( [in] DWORD dwAutoReconnectLimit );

    HRESULT GetEnableResends( [out] BOOL *pfEnableResends );

    HRESULT SetEnableResends( [in] BOOL fEnableResends );

    HRESULT GetEnableThinning( [out] BOOL *pfEnableThinning );

    HRESULT SetEnableThinning( [in] BOOL fEnableThinning );

    HRESULT GetMaxNetPacketSize( [out] DWORD *pdwMaxNetPacketSize );
}

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 96406BED-2B2B-11d3-B36B-00C04F6108FF ),
    helpstring( "IWMReaderStreamClock Interface"),
    pointer_default(unique),
    local
]
//
// Used to configure the network.  This interface is implemented by
// the IWMReader object.
//
interface IWMReaderStreamClock : IUnknown
{
    //
    // Get the current value of the stream clock
    //
    HRESULT GetTime( [in] QWORD *pcnsNow );

    //
    // Timer methods: All timers are automatically
    // killed whenever you stop the Reader.  When a timer
    // expires, you'll receive a WMT_TIMER OnStatus callback
    // with hr == S_OK, pValue = TimerId and pvContext == pvParam.
    //
    //
    HRESULT SetTimer( [in] QWORD cnsWhen,
                      [in] void *pvParam,
                      [out] DWORD *pdwTimerId );

    HRESULT KillTimer( [in] DWORD dwTimerId );
}


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 6d7cdc71-9888-11d3-8edc-00c04f6109cf ),
    helpstring( "IWMIndexer Interface"),
    pointer_default(unique),
    local
]
interface IWMIndexer : IUnknown
{
    //
    // Start is an asynchronous call; it returns almost immediately and the user
    // should wait for appropriate OnStatus calls to be sent to the callback.
    //
    HRESULT StartIndexing( [in] const WCHAR *pwszURL,
                           [in] IWMStatusCallback *pCallback,
                           [in] void *pvContext );

    HRESULT Cancel();
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( B70F1E42-6255-4df0-A6B9-02B212D9E2BB ),
    helpstring( "IWMIndexer2 Interface"),
    pointer_default(unique),
    local
]
interface IWMIndexer2 : IWMIndexer
{
    HRESULT Configure( [in] WORD wStreamNum,
                       [in] WMT_INDEXER_TYPE nIndexerType,
                       [in] void *pvInterval,
                       [in] void *pvIndexType );
}


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 05E5AC9F-3FB6-4508-BB43-A4067BA1EBE8 ),
    helpstring( "IWMLicenseBackup Interface"),
    pointer_default(unique),
    local
]
interface IWMLicenseBackup : IUnknown
{

    HRESULT BackupLicenses( [in] DWORD dwFlags,
                            [in] IWMStatusCallback *pCallback );

    HRESULT CancelLicenseBackup();
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( C70B6334-A22E-4efb-A245-15E65A004A13 ),
    helpstring( "IWMLicenseRestore Interface"),
    pointer_default(unique),
    local
]
interface IWMLicenseRestore : IUnknown
{
    HRESULT RestoreLicenses( [in] DWORD dwFlags,
                             [in] IWMStatusCallback *pCallback );

    HRESULT CancelLicenseRestore();
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 3C8E0DA6-996F-4ff3-A1AF-4838F9377E2E ),
    helpstring( "IWMBackupRestoreProps Interface"),
    pointer_default(unique),
    local
]
interface IWMBackupRestoreProps : IUnknown
{
    HRESULT GetPropCount( [out] WORD *pcProps );

    HRESULT GetPropByIndex( [in] WORD wIndex,
                       [out, size_is( *pcchNameLen )] WCHAR *pwszName,
                       [in, out] WORD *pcchNameLen,
                       [out] WMT_ATTR_DATATYPE *pType,
                       [out, size_is( *pcbLength )] BYTE *pValue,
                       [in, out] WORD *pcbLength );

    HRESULT GetPropByName( [in] LPCWSTR pszName,
                           [out] WMT_ATTR_DATATYPE *pType,
                           [out, size_is( *pcbLength )] BYTE *pValue,
                           [in, out] WORD *pcbLength );

    HRESULT SetProp( [in] LPCWSTR pszName,
                     [in] WMT_ATTR_DATATYPE Type,
                     [in, size_is( cbLength )] const BYTE *pValue,
                     [in] WORD cbLength );

    HRESULT RemoveProp( [in] LPCWSTR pcwszName );

    HRESULT RemoveAllProps();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( A970F41E-34DE-4a98-B3BA-E4B3CA7528F0 ),
    helpstring( "IWMCodecInfo Interface"),
    pointer_default(unique),
    local
]
interface IWMCodecInfo : IUnknown
{
    HRESULT GetCodecInfoCount(   [in]      REFGUID guidType,
                                 [out]     DWORD *pcCodecs );

    HRESULT GetCodecFormatCount( [in]      REFGUID guidType,
                                 [in]      DWORD dwCodecIndex,
                                 [out]     DWORD *pcFormat );

    HRESULT GetCodecFormat(      [in]      REFGUID guidType,
                                 [in]      DWORD dwCodecIndex,
                                 [in]      DWORD dwFormatIndex,
                                 [out]     IWMStreamConfig **ppIStreamConfig );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( AA65E273-B686-4056-91EC-DD768D4DF710 ),
    helpstring( "IWMCodecInfo2 Interface"),
    pointer_default(unique),
    local
]
interface IWMCodecInfo2 : IWMCodecInfo
{
    HRESULT GetCodecName( [in]  REFGUID guidType,
                          [in]  DWORD dwCodecIndex,
                          [out, size_is( *pcchName )] WCHAR *wszName,
                          [in, out] DWORD *pcchName );

    HRESULT GetCodecFormatDesc( [in]       REFGUID guidType,
                                [in]       DWORD dwCodecIndex,
                                [in]       DWORD dwFormatIndex,
                                [out]      IWMStreamConfig **ppIStreamConfig,
                                [out, size_is( *pcchDesc )]      WCHAR *wszDesc,
                                [in, out]  DWORD *pcchDesc );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 7e51f487-4d93-4f98-8ab4-27d0565adc51 ),
    helpstring( "IWMCodecInfo3 Interface"),
    pointer_default(unique),
    local
]
interface IWMCodecInfo3 : IWMCodecInfo2
{
    HRESULT GetCodecFormatProp( [in]       REFGUID guidType,
                                [in]       DWORD dwCodecIndex,
                                [in]       DWORD dwFormatIndex,
                                [in]       LPCWSTR pszName,
                                [out]      WMT_ATTR_DATATYPE *pType,
                                [out, size_is( *pdwSize )]      BYTE *pValue,
                                [in, out]   DWORD *pdwSize );

    HRESULT GetCodecProp(   [in]       REFGUID guidType,
                            [in]       DWORD dwCodecIndex,
                            [in]       LPCWSTR pszName,
                            [out]      WMT_ATTR_DATATYPE *pType,
                            [out, size_is( *pdwSize )]      BYTE *pValue,
                            [in, out]   DWORD *pdwSize );

    HRESULT SetCodecEnumerationSetting( [in]    REFGUID guidType,
                                        [in]    DWORD dwCodecIndex,
                                        [in]    LPCWSTR pszName,
                                        [in]    WMT_ATTR_DATATYPE Type,
                                        [in, size_is( dwSize )]    const BYTE *pValue,
                                        [in]    DWORD dwSize );

    HRESULT GetCodecEnumerationSetting( [in]    REFGUID guidType,
                                        [in]    DWORD dwCodecIndex,
                                        [in]    LPCWSTR pszName,
                                        [out]   WMT_ATTR_DATATYPE *pType,
                                        [out, size_is( *pdwSize )]   BYTE *pValue,
                                        [in,out]DWORD *pdwSize );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( DF683F00-2D49-4d8e-92B7-FB19F6A0DC57 ),
    helpstring( "IWMLanguageList Interface"),
    pointer_default(unique),
    local
]
interface IWMLanguageList : IUnknown
{
    HRESULT GetLanguageCount( [out] WORD *pwCount );

    HRESULT GetLanguageDetails( [in] WORD wIndex,
                                [out, size_is( *pcchLanguageStringLength )] WCHAR *pwszLanguageString,
                                [in, out] WORD *pcchLanguageStringLength );

    HRESULT AddLanguageByRFC1766String( [in] LPCWSTR_WMSDK_TYPE_SAFE pwszLanguageString,
                                        [out] WORD *pwIndex );
};



///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( dc10e6a5-072c-467d-bf57-6330a9dde12a ),
    helpstring( "IWMWriterPushSink Interface"),
    pointer_default(unique),
    local
]
interface IWMWriterPushSink : IWMWriterSink
{
    //
    // Connect to a publishing point on the server.
    // If the publishing point does not exist, and pwszTemplateURL is
    // non-NULL, an attempt will be made to create a new publishing point based
    // on the template URL.
    //
    HRESULT Connect(
        [in] LPCWSTR pwszURL,
        [in] LPCWSTR pwszTemplateURL,              // may be NULL
        [in] BOOL fAutoDestroy
        );

    //
    // Terminate the control connection with the downstream server. The data path on the
    // downstream server remains active for 5 minutes after which it is cleaned up.
    //
    HRESULT Disconnect( );

    //
    // Gracefully end the push distribution session. This shuts down the data path on
    // the server for the publishing point.
    //
    HRESULT EndSession();

};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( f6211f03-8d21-4e94-93e6-8510805f2d99 ),
    helpstring( "IWMDeviceRegistration Interface"),
    pointer_default(unique),
    local
]
interface IWMDeviceRegistration : IUnknown
{
    HRESULT RegisterDevice(
            [in] DWORD dwRegisterType,
            [in, size_is(cbCertificate)] BYTE *pbCertificate,
            [in] DWORD cbCertificate,
            [in] DRM_VAL16 SerialNumber,
            [out] IWMRegisteredDevice **ppDevice
            );

    HRESULT UnregisterDevice(
            [in] DWORD dwRegisterType,
            [in, size_is(cbCertificate)] BYTE *pbCertificate,
            [in] DWORD cbCertificate,
            [in] DRM_VAL16 SerialNumber
            );

    HRESULT GetRegistrationStats(
            [in] DWORD dwRegisterType,
            [out] DWORD *pcRegisteredDevices
            );

    HRESULT GetFirstRegisteredDevice(
            [in] DWORD dwRegisterType,
            [out] IWMRegisteredDevice **ppDevice
            );

    HRESULT GetNextRegisteredDevice(
            [out] IWMRegisteredDevice **ppDevice
            );

    HRESULT GetRegisteredDeviceByID(
            [in] DWORD dwRegisterType,
            [in, size_is(cbCertificate)] BYTE *pbCertificate,
            [in] DWORD cbCertificate,
            [in] DRM_VAL16 SerialNumber,
            [out] IWMRegisteredDevice **ppDevice
            );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( a4503bec-5508-4148-97ac-bfa75760a70d ),
    helpstring( "IWMRegisteredDevice Interface"),
    pointer_default(unique),
    local
]
interface IWMRegisteredDevice : IUnknown
{
    HRESULT GetDeviceSerialNumber(
            [out] DRM_VAL16 *pSerialNumber
            );

    HRESULT GetDeviceCertificate(
            [out] INSSBuffer **ppCertificate
            );

    HRESULT GetDeviceType(
            [out] DWORD *pdwType
            );

    HRESULT GetAttributeCount(
            [out] DWORD *pcAttributes
            );

    HRESULT GetAttributeByIndex(
            [in] DWORD dwIndex,
            [out] BSTR *pbstrName,
            [out] BSTR *pbstrValue
            );

    HRESULT GetAttributeByName(
            [in] BSTR bstrName,
            [out] BSTR *pbstrValue
            );

    HRESULT SetAttributeByName(
            [in] BSTR bstrName,
            [in] BSTR bstrValue
            );

    HRESULT Approve(
            [in] BOOL fApprove
            );

    HRESULT IsValid(
            [out] BOOL *pfValid
            );

    HRESULT IsApproved(
            [out] BOOL *pfApproved
            );

    HRESULT IsWmdrmCompliant(
            [out] BOOL *pfCompliant
            );

    HRESULT IsOpened(
            [out] BOOL *pfOpened
            );

    HRESULT Open();

    HRESULT Close();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 6A9FD8EE-B651-4bf0-B849-7D4ECE79A2B1 ),
    helpstring( "IWMProximityDetection Interface"),
    pointer_default(unique),
    local
]
interface IWMProximityDetection : IUnknown
{
    //
    // Generates a WMT_PROXIMITY_COMPLETED callback with a status code
    // indicating success or failure of the proximity detection.
    //
    HRESULT StartDetection(
            [in, size_is(cbRegistrationMsg)] BYTE *pbRegistrationMsg,
            [in] DWORD cbRegistrationMsg,
            [in, size_is(cbLocalAddress)] BYTE *pbLocalAddress,
            [in] DWORD cbLocalAddress,
            [in] DWORD dwExtraPortsAllowed,
            [out] INSSBuffer **ppRegistrationResponseMsg,
            [in] IWMStatusCallback *pCallback,
            [in] void *pvContext
            );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( A73A0072-25A0-4c99-B4A5-EDE8101A6C39 ),
    helpstring( "IWMDRMMessageParser Interface"),
    pointer_default(unique),
    local
]
interface IWMDRMMessageParser : IUnknown
{
    //
    // This method parses the Registration Request message and returns
    // the Device Cert and Id.
    //
    HRESULT ParseRegistrationReqMsg(
            [in, size_is(cbRegistrationReqMsg)] BYTE *pbRegistrationReqMsg,
            [in] DWORD cbRegistrationReqMsg,
            [out] INSSBuffer **ppDeviceCert,
            [out] DRM_VAL16 *pDeviceSerialNumber
            );

    //
    // This method parses the License Request message and returns
    // the Device Certificate, Device Id and action
    //
    HRESULT ParseLicenseRequestMsg(
            [in, size_is(pbLicenseRequestMsg)] BYTE *pbLicenseRequestMsg,
            [in] DWORD cbLicenseRequestMsg,
            [out] INSSBuffer **ppDeviceCert,
            [out] DRM_VAL16 *pDeviceSerialNumber,
            [out] BSTR *pbstrAction
            );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 69059850-6E6F-4bb2-806F-71863DDFC471 ),
    helpstring( "IWMDRMTranscryptor Interface"),
    pointer_default(unique),
    local
]
interface IWMDRMTranscryptor : IUnknown
{
    //
    // Generates a WMT_TRANSCRYPTOR_INIT callback with a status code
    // indicating success.
    //
    HRESULT Initialize(
            [in] BSTR bstrFileName,
            [in, size_is(cbLicenseRequestMsg) ] BYTE *pbLicenseRequestMsg,
            [in] DWORD cbLicenseRequestMsg,
            [out] INSSBuffer **ppLicenseResponseMsg,
            [in] IWMStatusCallback *pCallback,
            [in] void *pvContext
            );

    //
    // Generates a WMT_TRANSCRYPTOR_SEEKED callback with a status code
    // indicating success.
    //
    HRESULT Seek(
            [in] QWORD hnsTime
            );

    //
    // Generates a WMT_TRANSCRYPTOR_READ callback with a status code
    // indicating success. The pbData buffer isn't filled in until this
    // callback is fired.
    //
    // The special success code NS_S_TRANSCRYPTOR_EOF indicates that the
    // entire file has been read.
    //
    HRESULT Read(
            [in] BYTE *pbData,
            [in] DWORD *pcbData
            );
    //
    // Generates a WMT_TRANSCRYPTOR_CLOSED callback.
    //
    HRESULT Close();
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( e0da439f-d331-496a-bece-18e5bac5dd23 ),
    helpstring( "IWMDRMTranscryptor2 Interface"),
    pointer_default(unique),
    local
]
interface IWMDRMTranscryptor2 : IWMDRMTranscryptor
{
    //
    // cnsStartTime : Time to seek to, in hundreds of nanoseconds.
    // cnsDuration : Maximum duration of the transcrypted content. Set this parameter to 0 for no limit.
    // flRate: Transcrypted content to be encoded for playback at this rate.  This parameter should be set to 1 for
    //         normal playback.  An error will be returned if flRate is set to an unsupported rate.
    // fIncludeFileHeader: If TRUE, the first Read() call will include the ASF File Header.
    //
    // This function call generates a WMT_TRANSCRYPTOR_SEEKED callback with a status code
    // indicating success.
    //
    HRESULT SeekEx(
            [in] QWORD cnsStartTime,
            [in] QWORD cnsDuration,
            [in] float flRate,
            [in] BOOL fIncludeFileHeader
            );

    //
    // fEnable: If TRUE, the timestamps in the ASF packets returned after Seek() or SeekEx() will start
    // at zero.  This is the default behavior.  If the parameter is FALSE, the timestamps in the ASF packets
    // will reflect the real seek position.
    //
    HRESULT ZeroAdjustTimestamps( [in] BOOL fEnable );

    //
    // Returns the actual time that the transcryptor seeked to in result to a call to Seek() or SeekEx().  
    // The actual start time may differ from the start time specified in Seek() or SeekEx().
    // The actual start time is not available until after the first WMT_TRANSCRYPTOR_READ callback 
    // has been delivered.  If GetSeekStartTime() is invoked prior to that, it will return the 
    // start time specified in the call to Seek() or SeekEx().
    //
    HRESULT GetSeekStartTime( [out] QWORD *pcnsTime );

    //
    // Returns the total duration of the content
    //
    HRESULT GetDuration( [out] QWORD *pcnsDuration );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( b1a887b2-a4f0-407a-b02e-efbd23bbecdf ),
    helpstring( "IWMDRMTranscryptionManager Interface"),
    pointer_default(unique),
    local
]
interface IWMDRMTranscryptionManager : IUnknown
{
    //
    // IWMDRMTranscryptionManager provides an alternative way to create the
    // transcryptor objects. When this approach is used, the transcryptor
    // objects are optimized for faster turnaround times in initializing the
    // transcryption. This results in lower open latencies while using these
    // transcryptor objects.
    //
    HRESULT CreateTranscryptor(
                [out] IWMDRMTranscryptor **ppTranscryptor
                );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 6f497062-f2e2-4624-8ea7-9dd40d81fc8d ),
    helpstring( "IWMWatermarkInfo Interface"),
    pointer_default(unique),
    local
]

//
// The writer can be QI'd for this interface to enumerate all of the
// watermark DMOs installed on a system.
//

interface IWMWatermarkInfo : IUnknown
{
    HRESULT GetWatermarkEntryCount(
                [in] WMT_WATERMARK_ENTRY_TYPE wmetType,
                [out] DWORD* pdwCount
                );

    HRESULT GetWatermarkEntry(
                [in] WMT_WATERMARK_ENTRY_TYPE wmetType,
                [in] DWORD dwEntryNum,
                [out] WMT_WATERMARK_ENTRY* pEntry
                );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( BDDC4D08-944D-4d52-A612-46C3FDA07DD4 ),
    helpstring( "IWMReaderAccelerator Interface" ),
    pointer_default( unique ),
    local
]

//
// The Reader can be QI'ed for this interface for DirectX-VA support
//
interface IWMReaderAccelerator : IUnknown
{
    HRESULT GetCodecInterface( [in]             DWORD  dwOutputNum,
                               [in]             REFIID riid,
                               [out] void     **ppvCodecInterface );

    HRESULT Notify( [in]  DWORD             dwOutputNum,
                    [in]  WM_MEDIA_TYPE    *pSubtype );
};

///////////////////////////////////////////////////////////////////////////////

[
    object,
    uuid( f369e2f0-e081-4fe6-8450-b810b2f410d1 ),
    helpstring( "IWMReaderTimecode Interface" ),
    pointer_default(unique),
    local
]
interface IWMReaderTimecode : IUnknown
{
    //
    // Get the number of ranges of timecode data for a given stream in the file.
    // Returns 0 if there is no timecode index for the specified stream.
    //
    HRESULT GetTimecodeRangeCount( [in] WORD wStreamNum,
                                   [out] WORD *pwRangeCount );

    //
    // Gets the first and last timecode available for a given range.
    //
    HRESULT GetTimecodeRangeBounds( [in] WORD wStreamNum,
                                    [in] WORD wRangeNum,
                                    [out] DWORD *pStartTimecode,
                                    [out] DWORD *pEndTimecode );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( BB3C6389-1633-4e92-AF14-9F3173BA39D0 ),
    helpstring( "IWMAddressAccess Interface"),
    pointer_default(unique),
    local
]
interface IWMAddressAccess : IUnknown
{
    //
    // Determine the number of access list entries (by type)
    //
    HRESULT GetAccessEntryCount( [in] WM_AETYPE aeType,
                                 [out] DWORD *pcEntries );

    //
    // Retrieve a single address access entry (by type)
    //
    HRESULT GetAccessEntry( [in] WM_AETYPE aeType,
                            [in] DWORD dwEntryNum,
                            [out] WM_ADDRESS_ACCESSENTRY *pAddrAccessEntry );

    //
    // Add a single address access entry
    //
    HRESULT AddAccessEntry( [in] WM_AETYPE aeType,
                            [in] WM_ADDRESS_ACCESSENTRY *pAddrAccessEntry );

    //
    // Remove a single address access entry (by type)
    //
    HRESULT RemoveAccessEntry( [in] WM_AETYPE aeType,
                               [in] DWORD dwEntryNum );
};


///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 65a83fc2-3e98-4d4d-81b5-2a742886b33d ),
    helpstring( "IWMAddressAccess2 Interface" ),
    pointer_default(unique),
    local
]
interface IWMAddressAccess2 : IWMAddressAccess
{
    //
    // Retrieve a single address access entry (by type)
    //
    HRESULT GetAccessEntryEx( [in] WM_AETYPE aeType,
                              [in] DWORD dwEntryNum,
                              [out] BSTR *pbstrAddress,
                              [out] BSTR *pbstrMask );

    //
    // Add a single address access entry
    //
    HRESULT AddAccessEntryEx( [in] WM_AETYPE aeType,
                              [in] BSTR bstrAddress,
                              [in] BSTR bstrMask );

};
///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 9F0AA3B6-7267-4d89-88F2-BA915AA5C4C6 ),
    helpstring( "IWMImageInfo Interface"),
    pointer_default(unique),
    local
]
//
// Used to get "APIC" ID3v2 frames
//
interface IWMImageInfo : IUnknown
{
    HRESULT GetImageCount(  [out] DWORD* pcImages);

    HRESULT GetImage(       [in] DWORD wIndex,
                            [in, out] WORD* pcchMIMEType,
                            [out, size_is( *pcchMIMEType )] WCHAR* pwszMIMEType,
                            [in, out] WORD* pcchDescription,
                            [out, size_is( *pcchDescription )] WCHAR* pwszDescription,
                            [out] WORD* pImageType,
                            [in, out] DWORD* pcbImageData,
                            [out, size_is( *pcbImageData )] BYTE* pbImageData );
};

///////////////////////////////////////////////////////////////////////////////
[
    object,
    uuid( 6967F2C9-4E26-4b57-8894-799880F7AC7B),
    helpstring( "IWMLicenseRevocationAgent Interface"),
    pointer_default(unique),
    local
]
interface IWMLicenseRevocationAgent : IUnknown
{

    HRESULT GetLRBChallenge(  [in] BYTE *pMachineID,
                                [in] DWORD dwMachineIDLength,
                                [in] BYTE *pChallenge,
                                [in] DWORD dwChallengeLength,
                                [out] BYTE *pChallengeOutput,
                                [out] DWORD *pdwChallengeOutputLength );

    HRESULT ProcessLRB(  [in] BYTE *pSignedLRB,
                           [in] DWORD dwSignedLRBLength,
                           [out] BYTE *pSignedACK,
                           [out] DWORD *pdwSignedACKLength );

};


///////////////////////////////////////////////////////////////////////////////

