summaryrefslogtreecommitdiffstats
path: root/dxsdk/Include/DShowIDL/sbe.idl
diff options
context:
space:
mode:
Diffstat (limited to 'dxsdk/Include/DShowIDL/sbe.idl')
-rw-r--r--dxsdk/Include/DShowIDL/sbe.idl1348
1 files changed, 1348 insertions, 0 deletions
diff --git a/dxsdk/Include/DShowIDL/sbe.idl b/dxsdk/Include/DShowIDL/sbe.idl
new file mode 100644
index 00000000..246b148c
--- /dev/null
+++ b/dxsdk/Include/DShowIDL/sbe.idl
@@ -0,0 +1,1348 @@
+
+/*++
+
+ Copyright (c) 2002 Microsoft Corporation
+
+ Module Name:
+
+ sbe.idl
+
+ Abstract:
+
+ This module the StreamBuffer interface definitions & CLSIDs, public
+
+--*/
+
+import "unknwn.idl" ;
+import "wtypes.idl" ;
+import "objidl.idl";
+import "strmif.idl" ;
+
+// ============================================================================
+
+// interfaces
+interface IStreamBufferSink ; // locking & recording
+interface IStreamBufferSink2 ; // ext locking
+interface IStreamBufferSink3 ; // specify the minimum
+interface IStreamBufferSource ; // associates with IStreamBufferSink
+interface IStreamBufferRecordControl ; // recording control
+interface IStreamBufferRecordingAttribute ; // StreamBuffer attribute creation
+interface IEnumStreamBufferRecordingAttrib ; // StreamBuffer attribute enumeration
+interface IStreamBufferConfigure ; // configuration interface
+interface IStreamBufferConfigure2 ; // configuration interface; more
+interface IStreamBufferMediaSeeking ; // IMediaSeeking but with different GUID
+interface IStreamBufferMediaSeeking2 ; // + available filter & frame rate on FF/RW
+interface IStreamBufferPolicy ; // StreamBuffer policies
+interface IStreamBufferInitialize ; // allows 3rd party app to set HKEY
+interface IStreamBufferDataCounters ; // collect data rate from the pins
+
+[
+ object,
+ uuid(9ce50f2d-6ba7-40fb-a034-50b1a674ec78),
+ pointer_default(unique)
+]
+[local] interface IStreamBufferInitialize : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetHKEY ()
+
+ Implemented on StreamBufferStreamSink and StreamBufferSource filters.
+ Gives a hosting application the ability to specify HKEY root in
+ registry. This method must called **early**: after the filter is
+ instantiated, but before StreamBufferSource is locked (explicitly or
+ implicitely) if calling the method on StreamBufferSource, or before
+ a source is set (via IStreamBufferSource or IFileSourceFilter) if
+ calling the method on StreamBufferStreamSource. If a call is made
+ after either filter has been initialized internally, the call will
+ fail with E_UNEXPECTED. The hosting application is responsible for
+ ensuring that the HKEY passed in is writable & readable per the
+ logged-on user privileges. The HKEY is duplicated internally,
+ so the caller can close it after making this call.
+ --*/
+ HRESULT
+ SetHKEY (
+ [in] HKEY hkeyRoot
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetSIDs ()
+
+ Implemented on StreamBufferStreamSink and StreamBufferSource filters.
+ Provides a way for the hosting application to specify security-level
+ sharing between capture and render processes and contexts. By
+ default security attributes are inherited from the hosting process,
+ unless the application overrides the defaults and provides them via
+ this method.
+ --*/
+ HRESULT
+ SetSIDs (
+ [in] DWORD cSIDs,
+ [in, size_is (cSIDs)] PSID * ppSID
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSink
+
+ Stream Source interface;
+ implemented on the StreamBufferSink filter;
+ Only way to get a recorder object's IUnknown (object will subsequently
+ be associated with this Sink)
+--*/
+
+enum {
+ RECORDING_TYPE_CONTENT = 0, // no post-recording or overlapped
+ RECORDING_TYPE_REFERENCE, // allows post-recording & overlapped
+} ;
+
+[
+ object,
+ uuid(afd1f242-7efd-45ee-ba4e-407a25c9a77a),
+ pointer_default(unique)
+]
+interface IStreamBufferSink : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ LockProfile ()
+
+ 1. Locks the profile;
+ 2. No *new* input pin connections will be accepted;
+ 3. Existing pins that are, or have ever been, connected can be
+ reconnected if the media type is exactly the same as the first
+ successful connection;
+ 4. Can be called multiple times with the same parameter as the initial
+ LockProfile() call was made with i.e. more than once with NULL if
+ initially locked with NULL, or more than once with a string if
+ initially locked with a string; if the profile is already locked,
+ and the parameters are the same, returns S_FALSE, else the call
+ fails (if trying to lock a locked profile with a different
+ parameter)
+ 5. Must be called before the filter that implements this interface is
+ ever run; when it is run, it locks implicitely and this method has
+ no effect if called with NULL parameters, or fails if called with
+ non-NULL parameter for the reasons listed above;
+ 6. Errors with VFW_E_UNSUPPORTED_STREAM if there are no streams in the
+ profile;
+
+ Parameter Detail
+ ----------------
+
+ pszStreamBufferFilename
+
+ Is a NULL-terminated filename string. If the content written by
+ this sink is to be shared cross-process, this parameter specifies a
+ filename that will be opened by any reader(s) to read & render the
+ content sent into the sink.
+
+ Can be NULL (not specified)
+
+ Must be a full-path filename; if no path is specified, the file is
+ created in a "current" directory
+
+ If the file already exists, the call fails
+
+ Is opened with DELETE_ON_CLOSE flag, so is automatically deleted
+ when the sink is unlocked, or when the hosting process terminates
+ --*/
+ HRESULT
+ LockProfile (
+ [in] LPCWSTR pszStreamBufferFilename
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ CreateRecorder ()
+
+ 1. Returns a *new* recorder object's IUnknown;
+ 2. Caller can call QueryInterface() on the returned pointer to get
+ interface pointers to configure & control the recording;
+ 3. Returned IUnknown pointer is ref'd & must be Release()'d by the
+ caller
+ 4. IStreamBufferSink interface must have been locked (explicitely or
+ implicitely) prior to call
+
+ To create an ordinary recording, specify RECORDING_TYPE_CONTENT for the
+ dwRecordType parammeter. This will record the content directly into
+ the specified file. These recording types only accept start and stop
+ times that occur in the future.
+
+ A recording of type RECORDING_TYPE_REFERENCE generates a small file
+ that references content saved in temporary storage. Recordings of this
+ type can have start and stop times that occurs in the past, and can
+ overlap other same-type recordings.
+
+ Reference recording *content* will be saved in the same subdirectory as
+ the specified reference file, but with hidden and system attributes.
+ The naming convention of the files will append a _1.sbe, _2.sbe, etc...
+ to the filename (minus extension) specified in the call e.g. a
+ "seinfeld01.sbe" reference file will have saved content in hidden
+ and system files "seinfeld01_1.sbe", "seinfeld01_2.sbe", etc...
+
+ --*/
+ HRESULT
+ CreateRecorder (
+ [in] LPCWSTR pszFilename,
+ [in] DWORD dwRecordType, // RECORDING_TYPE_CONTENT or RECORDING_TYPE_REFERENCE
+ [out] IUnknown ** pRecordingIUnknown
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ IsProfileLocked ()
+
+ 1. Returns S_OK if the profile is locked and S_FALSE if it is not.
+ 2. Returns E_FAIL on error.
+ --*/
+ HRESULT
+ IsProfileLocked (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSink2 ()
+
+ Stream Source interface;
+ implemented on the StreamBufferSink filter;
+--*/
+[
+ object,
+ uuid(DB94A660-F4FB-4bfa-BCC6-FE159A4EEA93),
+ pointer_default(unique)
+]
+interface IStreamBufferSink2 : IStreamBufferSink
+{
+ /*++
+ ------------------------------------------------------------------------
+ UnlockProfile ()
+
+ 1. Unlocks a profile explicitely.
+ 2. Is a noop if the sink is not locked & returns S_FALSE.
+ 3. Can only be called when the graph & filter are stopped.
+ 4. Since recordings are bound to the "lock session", incomplete
+ recordings i.e. those that have never been started, are
+ invalidated & must be re-created under the next "lock session".
+ 5. Profile still unlocks implicitly when the filter is stopped.
+ --*/
+ HRESULT
+ UnlockProfile (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSink3 ()
+
+ Stream Source interface;
+ implemented on the StreamBufferSink filter;
+--*/
+[
+ object,
+ uuid(974723f2-887a-4452-9366-2cff3057bc8f),
+ pointer_default(unique)
+]
+interface IStreamBufferSink3 : IStreamBufferSink2
+{
+ /*++
+ -----------------------------------------------------------------------
+ SetAvailableFilter ()
+
+ Bounds the minimum. This affects readers so they cannot seek past
+ the specified minimum.
+
+ Parameter Detail
+ ----------------
+
+ prtMin
+
+ min time relative to "now"
+
+ cannot be NULL
+
+ [in]: time, specified relative to the last sample written, to set
+ as the minimum time available to readers; valid values are <= 0;
+ use -MAXLONGLONG if all the backing store should be made available.
+
+ [out]: actual min time; if the [in] value further back than what is
+ available, the [out] value will be set to the actual time made
+ available.
+
+ Return Values
+ -------------
+
+ success S_OK
+
+ failure error code
+ --*/
+ HRESULT
+ SetAvailableFilter (
+ [in, out] REFERENCE_TIME * prtMin
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferSource ()
+
+ Stream Source reader interface;
+ Implemented on the StreamBufferSource filter;
+--*/
+[
+ object,
+ uuid(1c5bd776-6ced-4f44-8164-5eab0e98db12),
+ pointer_default(unique)
+]
+interface IStreamBufferSource : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetStreamSink ()
+
+ 1. Sets the StreamBuffer Sink that streams from this Source;
+ 2. IStreamBufferSink object must be in the same process as this object;
+ 3. Interface is AddRef()'d if the call succeeds;
+
+ Parameter Detail
+ ----------------
+
+ pIStreamBufferSink
+
+ Sink that will stream to this Source
+ --*/
+ HRESULT
+ SetStreamSink (
+ [in] IStreamBufferSink * pIStreamBufferSink
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferRecordControl
+
+ obtained by QIing IStreamBufferSink::CreateRecorder()-returned IUnknown *
+--*/
+[
+ object,
+ uuid(ba9b6c99-f3c7-4ff2-92db-cfdd4851bf31),
+ pointer_default(unique)
+]
+interface IStreamBufferRecordControl : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ Start ()
+
+ 1. Starts a recording;
+ 2. Will save to the filename that is specified when this interface's
+ IUnknown is requested (IStreamBufferSink::CreateRecorder());
+
+ Parameter Detail
+ ----------------
+
+ rtStart
+
+ Start time relative to "now;
+
+ If the recording type is a content recording, can only refer to
+ seconds in the future; allowed seconds are [0,5]
+
+ If the recording type is a reference recording, can refer to any
+ time that still has valid content i.e. content that has not yet
+ become stale
+
+ If the recording is a reference recording and (* prtStart) is
+ earlier than the earliest still-valid content, the call will reset
+ it to the earliest content; the value when the recording was
+ actually started will be [out]
+ --*/
+ HRESULT
+ Start (
+ [in,out] REFERENCE_TIME * prtStart
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Stop ()
+
+ 1. Stops a recording;
+ 2. Closes out the file;
+
+ Parameter Detail
+ ----------------
+
+ rtStart
+
+ Stop time relative to "now;
+
+ If the recording type is a content recording, can only refer to
+ seconds in the future; allowed seconds are [0,5]
+
+ If the recording type is a reference recording, can refer to any
+ time that still has valid content i.e. content that has not yet
+ become stale; stop time cannot be <= start time
+ --*/
+ HRESULT
+ Stop (
+ [in] REFERENCE_TIME rtStop
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetRecordingStatus ()
+
+ 1. Retrieves the status of the recording
+
+ Parameter Detail
+ ----------------
+
+ phResult
+
+ The (current) status of writing or closing the recording file;
+
+ Can be NULL;
+
+ pbStarted
+
+ If supplied, set to a non-zero value if the recording has been
+ started
+
+ Can be NULL;
+
+ pbStopped
+
+ If supplied, set to a non-zero value if the recording has been
+ stopped;
+
+ Can be NULL;
+
+ NOTE: If the recording has never been started, it will not be flagged
+ as stopped.
+
+ --*/
+ HRESULT
+ GetRecordingStatus (
+ [out] HRESULT * phResult,
+ [out] BOOL * pbStarted,
+ [out] BOOL * pbStopped
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferRecComp
+
+ CoCreateInstance CLSID_StreamBufferComposeRecording and QueryInterface for
+ this interface; this interface allows the creation of a single target
+ content recording which consists of a number of concatenated recordings
+ (reference or content; can mix & match if desired)
+--*/
+
+[
+ object,
+ uuid(9E259A9B-8815-42ae-B09F-221970B154FD),
+ pointer_default(unique)
+]
+interface IStreamBufferRecComp : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ Initialize ()
+
+ 1. Initializes for a target recording
+
+ Parameter Detail
+ ----------------
+
+ pszTargetFilename
+
+ Sets the target filename
+
+ Fails if the file already exists
+
+ pszSBRecProfileRef
+
+ Must be a completed, SBE-generated recording
+
+ This recording's profile will be used to define the target profile
+
+ Appended files must have exactly the same profile
+ --*/
+ HRESULT
+ Initialize (
+ [in] LPCWSTR pszTargetFilename,
+ [in] LPCWSTR pszSBRecProfileRef
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Append ()
+
+ 1. appends an entire recording
+ 2. fails if the recording is live
+ --*/
+ HRESULT
+ Append (
+ [in] LPCWSTR pszSBRecording
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ AppendEx ()
+
+ 1. appends the specified portion of the recording; the parameters must
+ be accurate; the call will not readjust them within the boundaries
+ 2. the time spread must be at least 2 seconds
+ 3. fails if the recording is live
+ --*/
+ HRESULT
+ AppendEx (
+ [in] LPCWSTR pszSBRecording,
+ [in] REFERENCE_TIME rtStart,
+ [in] REFERENCE_TIME rtStop
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetCurrentLength ()
+
+ 1. returns the current length of the recording; updates as recordings
+ are appended;
+ 2. can be called repeatedly during a Append() call on another
+ thread;
+ --*/
+ HRESULT
+ GetCurrentLength (
+ [out] DWORD * pcSeconds
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Close ()
+
+ 1. explicitely closes the recording
+
+ 2. final release of interface closes the recording as well
+ --*/
+ HRESULT
+ Close (
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ Cancel ()
+
+ 1. cancels an in-progress appending operation; has no effect otherwise
+ --*/
+ HRESULT
+ Cancel (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferRecordingAttribute
+
+ obtained by calling QueryInterface on a recorder
+
+ well-known attributes:
+
+ NAME DESCRIPTION
+ ------------------- ----------------------------------------------------
+
+ Title String containing the content title.
+
+ Author String containing the name of the content author.
+
+ Description String containing a description of the content.
+
+ Rating String containing a content rating.
+
+ Copyright String containing a content copyright message.
+
+ Duration Quadruple word value containing the playing duration
+ of the file, in 100-nanosecond units.
+
+ Bitrate Double word value containing the bit rate.
+
+ Seekable Boolean value; true denoting that the content is
+ seekable.
+
+ Stridable Boolean value, true denoting that the content is
+ stridable (fast forward and rewind are enabled).
+
+ Broadcast Boolean value; true denoting that the content is not
+ copyright-protected, and can be broadcast.
+
+ Use_DRM reserved
+
+ DRM_Flags reserved
+
+ DRM_Level reserved
+
+ Is_Protected reserved
+
+ Is_Trusted reserved
+
+ Signature_Name reserved
+
+ HasAudio Boolean, true denoting the content includes an
+ audio stream.
+
+ HasImage Boolean, true denoting the content includes a still
+ image stream (such as JPEG images).
+
+ HasScript Boolean, true denoting the content includes a script
+ stream.
+
+ HasVideo Boolean, true denoting the content includes a video
+ stream.
+
+ CurrentBitrate Double word containing the current total bitrate,
+ usually used for MEB (multi-bit rate) streams.
+
+ OptimalBitrate Double word containing the minimum total bitrate
+ recommended to stream the content and get
+ maximum quality.
+
+ WM/AlbumTitle String containing the album title.
+
+ WM/Track Double word containing the track number.
+
+ WM/PromotionURL String with a URL to an HTML page that contains
+ information about products and events (such as
+ concerts) that are related to this music.
+
+ WM/AlbumCoverURL String with a URL to an HTML page that contains an
+ image of the album cover and information about
+ the album.
+
+ WM/Genre String with the genre of the music.
+
+ WM/Year String with the year of publication of the music.
+
+ WM/GenreID
+
+ WM/MCDI
+
+ BannerImageType One member of the WMT_ATTR_IMAGETYPE enumeration
+ type.
+
+ BannerImageData The actual image data: a bitmap, JPEG, or GIF image.
+
+
+ BannerImageURL If the banner image is clicked on then this URL is
+ activated.
+
+ CopyrightURL An URL to a copyright page.
+
+ NSC_Name String containing the multicast station contact
+ name (read-only).
+
+ NSC_Address String containing the multicast station contact
+ address (read-only).
+
+ NSC_Phone String containing the multicast station contact
+ phone number (read-only).
+
+ NSC_Email String containing the multicast station contact
+ email address (read-only).
+
+ NSC_Description String containing the multicast station contact
+ description (read-only).
+
+--*/
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// List of pre-defined attributes " )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingDuration[] =L\"Duration\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBitrate[] =L\"Bitrate\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSeekable[] =L\"Seekable\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingStridable[] =L\"Stridable\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBroadcast[] =L\"Broadcast\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingProtected[] =L\"Is_Protected\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTrusted[] =L\"Is_Trusted\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSignature_Name[] =L\"Signature_Name\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasAudio[] =L\"HasAudio\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasImage[] =L\"HasImage\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasScript[] =L\"HasScript\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasVideo[] =L\"HasVideo\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingCurrentBitrate[] =L\"CurrentBitrate\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingOptimalBitrate[] =L\"OptimalBitrate\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasAttachedImages[] =L\"HasAttachedImages\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSkipBackward[] =L\"Can_Skip_Backward\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingSkipForward[] =L\"Can_Skip_Forward\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNumberOfFrames[] =L\"NumberOfFrames\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingFileSize[] =L\"FileSize\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasArbitraryDataStream[] =L\"HasArbitraryDataStream\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingHasFileTransferStream[] =L\"HasFileTransferStream\";" )
+cpp_quote( "" )
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// The content description object supports 5 basic attributes." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTitle[] =L\"Title\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAuthor[] =L\"Author\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingDescription[] =L\"Description\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingRating[] =L\"Rating\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingCopyright[] =L\"Copyright\";" )
+cpp_quote( "" )
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// These attributes are used to configure DRM using IWMDRMWriter::SetDRMAttribute." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR *g_wszStreamBufferRecordingUse_DRM = L\"Use_DRM\";" )
+cpp_quote( "static const WCHAR *g_wszStreamBufferRecordingDRM_Flags = L\"DRM_Flags\";" )
+cpp_quote( "static const WCHAR *g_wszStreamBufferRecordingDRM_Level = L\"DRM_Level\";" )
+cpp_quote( "" )
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// These are the additional attributes defined in the WM attribute" )
+cpp_quote( "// namespace that give information about the content." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAlbumTitle[] =L\"WM/AlbumTitle\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTrack[] =L\"WM/Track\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingPromotionURL[] =L\"WM/PromotionURL\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAlbumCoverURL[] =L\"WM/AlbumCoverURL\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingGenre[] =L\"WM/Genre\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingYear[] =L\"WM/Year\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingGenreID[] =L\"WM/GenreID\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingMCDI[] =L\"WM/MCDI\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingComposer[] =L\"WM/Composer\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingLyrics[] =L\"WM/Lyrics\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingTrackNumber[] =L\"WM/TrackNumber\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingToolName[] =L\"WM/ToolName\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingToolVersion[] =L\"WM/ToolVersion\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingIsVBR[] =L\"IsVBR\";" )
+
+//
+// WM/AlbumArtist is a potentially different value than Author
+//
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAlbumArtist[] =L\"WM/AlbumArtist\";" )
+cpp_quote( "" )
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// These optional attributes may be used to give information " )
+cpp_quote( "// about the branding of the content." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBannerImageType[] =L\"BannerImageType\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBannerImageData[] =L\"BannerImageData\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingBannerImageURL[] =L\"BannerImageURL\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingCopyrightURL[] =L\"CopyrightURL\";" )
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// Optional attributes, used to give information " )
+cpp_quote( "// about video stream properties." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAspectRatioX[] =L\"AspectRatioX\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingAspectRatioY[] =L\"AspectRatioY\";" )
+
+cpp_quote( "////////////////////////////////////////////////////////////////" )
+cpp_quote( "//" )
+cpp_quote( "// The NSC file supports the following attributes." )
+cpp_quote( "//" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCName[] =L\"NSC_Name\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCAddress[] =L\"NSC_Address\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCPhone[] =L\"NSC_Phone\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCEmail[] =L\"NSC_Email\";" )
+cpp_quote( "static const WCHAR g_wszStreamBufferRecordingNSCDescription[] =L\"NSC_Description\";" )
+cpp_quote( "" )
+
+//
+// StreamBuffer Attribute datatypes;
+//
+typedef enum {
+ STREAMBUFFER_TYPE_DWORD = 0,
+ STREAMBUFFER_TYPE_STRING = 1,
+ STREAMBUFFER_TYPE_BINARY = 2,
+ STREAMBUFFER_TYPE_BOOL = 3,
+ STREAMBUFFER_TYPE_QWORD = 4,
+ STREAMBUFFER_TYPE_WORD = 5,
+ STREAMBUFFER_TYPE_GUID = 6,
+} STREAMBUFFER_ATTR_DATATYPE ;
+
+[
+ object,
+ uuid(16CA4E03-FE69-4705-BD41-5B7DFC0C95F3),
+ pointer_default(unique)
+]
+interface IStreamBufferRecordingAttribute : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetAttribute ()
+
+ 1. Sets an attribute on a recording object;
+ 2. Fails if the IStreamBufferRecordControl::Start has already been successfully
+ called;
+ 3. If an attribute of the same name already exists, overwrites the old;
+ --*/
+ HRESULT
+ SetAttribute (
+ [in] ULONG ulReserved,
+ [in] LPCWSTR pszAttributeName,
+ [in] STREAMBUFFER_ATTR_DATATYPE StreamBufferAttributeType,
+ [in, size_is (cbAttributeLength)] BYTE * pbAttribute,
+ [in] WORD cbAttributeLength
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetAttributeCount ()
+
+ 1. Returns the count of attributes currently set;
+ --*/
+ HRESULT
+ GetAttributeCount (
+ [in] ULONG ulReserved,
+ [out] WORD * pcAttributes
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetAttributeByName ()
+
+ 1. Given a name, returns the attribute data;
+ 2. If the provided buffer is too small, returns VFW_E_BUFFER_OVERFLOW,
+ and (* pcbLength) contains the minimum required length of the buffer
+ 3. To learn the length of the attribute, pass in non-NULL pcbLength,
+ and NULL pbAttribute parameter; [out] value will be the length of
+ the attribute
+ --*/
+ HRESULT
+ GetAttributeByName (
+ [in] LPCWSTR pszAttributeName,
+ [in] ULONG * pulReserved,
+ [out] STREAMBUFFER_ATTR_DATATYPE * pStreamBufferAttributeType,
+ [out, size_is (* pcbLength)] BYTE * pbAttribute,
+ [in, out] WORD * pcbLength
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetAttributeByIndex ()
+
+ 1. Given an 0-based index, returns the attribute name and data
+ 2. If either buffer is too small, returns VFW_E_BUFFER_OVERFLOW, and
+ (* pcbLength) and (* pcchNameLength) contain the minimum required
+ length of each buffer
+ 3. The length returned by pcchNameLength includes the null-terminator
+ 4. To learn the length of the name & attribute, pass in non-NULL
+ pcchNameLength & pcbLength, and NULL pszAttributeName & pbAttribute
+ parameters; [out] value of the non-NULL parameters will be the
+ lengths of the name and attribute
+ --*/
+ HRESULT
+ GetAttributeByIndex (
+ [in] WORD wIndex,
+ [in] ULONG * pulReserved,
+ [out] WCHAR * pszAttributeName,
+ [in, out] WORD * pcchNameLength, // includes NULL-terminator; in BYTES
+ [out] STREAMBUFFER_ATTR_DATATYPE * pStreamBufferAttributeType,
+ [out, size_is (* pcbLength)] BYTE * pbAttribute,
+ [in, out] WORD * pcbLength
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ EnumAttributes ()
+
+ 1. Returns a StreamBuffer attribute enumeration object that snapshots
+ the attributes at time-of-call
+ --*/
+ HRESULT
+ EnumAttributes (
+ [out] IEnumStreamBufferRecordingAttrib ** ppIEnumStreamBufferAttrib
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IEnumStreamBufferRecordingAttrib
+
+ obtained by calling IStreamBufferRecordingAttribute::EnumAttributes, or
+ calling clone on this interface
+--*/
+
+typedef struct {
+ LPWSTR pszName ; // allocated by callee; freed by caller
+ STREAMBUFFER_ATTR_DATATYPE StreamBufferAttributeType ;
+ BYTE * pbAttribute ; // allocated by callee; freed by caller
+ WORD cbLength ;
+} STREAMBUFFER_ATTRIBUTE ;
+
+[
+ object,
+ uuid (C18A9162-1E82-4142-8C73-5690FA62FE33),
+ pointer_default(unique)
+]
+interface IEnumStreamBufferRecordingAttrib : IUnknown
+{
+ HRESULT
+ Next (
+ [in] ULONG cRequest,
+ [in, out, size_is (cRequest)] STREAMBUFFER_ATTRIBUTE * pStreamBufferAttribute,
+ [out] ULONG * pcReceived
+ ) ;
+
+ HRESULT
+ Skip (
+ [in] ULONG cRecords
+ ) ;
+
+ HRESULT
+ Reset (
+ ) ;
+
+ HRESULT
+ Clone (
+ [out] IEnumStreamBufferRecordingAttrib ** ppIEnumStreamBufferAttrib
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferConfigure
+
+--*/
+[
+ object,
+ uuid(ce14dfae-4098-4af7-bbf7-d6511f835414),
+ pointer_default(unique)
+]
+interface IStreamBufferConfigure : IUnknown
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetStreamBufferDirectory ()
+
+ 1. Sets the directory where all content is saved, ringbuffer &
+ StreamBuffer;
+ 2. Creates directory if necessary;
+ 3. All TEMP files have hidden+system attributes
+ --*/
+ HRESULT
+ SetDirectory (
+ [in] LPCWSTR pszDirectoryName
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetStreamBufferDirectory ()
+
+ 1. Retrieves previously set backing store directory, or default
+ location if none was specified
+ --*/
+ HRESULT
+ GetDirectory (
+ [out] LPWSTR * ppszDirectoryName
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetBackingFileCount ()
+
+ 1. Sets the number of backing files
+ 2. valid values
+
+ 4 <= min <= 100
+ 6 <= max <= 102
+ min max delta >= 2
+ --*/
+ HRESULT
+ SetBackingFileCount (
+ [in] DWORD dwMin,
+ [in] DWORD dwMax
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetBackingFileCount ()
+
+ 1. Retrieves previously set backing file counts, or defaults if none
+ have have been set
+ --*/
+ HRESULT
+ GetBackingFileCount (
+ [out] DWORD * pdwMin,
+ [out] DWORD * pdwMax
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetEachBackingFileDuration ()
+
+ 1. Sets the seconds of content each backing file will hold
+ 2. valid values:
+
+ dwSeconds >= 15
+ --*/
+ HRESULT
+ SetBackingFileDuration (
+ [in] DWORD dwSeconds
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetEachBackingFileDuration ()
+
+ 1. Retrieves previously set backing file duration, or default of none
+ is set
+ --*/
+ HRESULT
+ GetBackingFileDuration (
+ [out] DWORD * pdwSeconds
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferConfigure2
+
+--*/
+[
+ object,
+ uuid(53E037BF-3992-4282-AE34-2487B4DAE06B),
+ pointer_default(unique)
+]
+interface IStreamBufferConfigure2 : IStreamBufferConfigure
+{
+ /*++
+ ------------------------------------------------------------------------
+ SetMultiplexedPacketSize ()
+
+ 1. sets the size of the target multiplexed packet size
+ 2. valid values:
+
+ 8192 <= cbBytesPerPacket <= 65535
+
+ This is useful if low-bitrate streams are used, and the time to fill a
+ multiplexed packet is excessive when the default value of 65535 bytes
+ is used.
+ --*/
+ HRESULT
+ SetMultiplexedPacketSize (
+ [in] DWORD cbBytesPerPacket
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetMultiplexedPacketSize ()
+
+ 1. gets the size of the target multiplexed packet size
+ --*/
+ HRESULT
+ GetMultiplexedPacketSize (
+ [out] DWORD * pcbBytesPerPacket
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ SetFFTransitionRates ()
+
+ 1. sets the fast forward (FF) rates for which the Stream Buffer Engine
+ transitions from FullFrame to KeyFrame to KeyFrame + Seeks.
+ 2. valid values:
+
+ 1 < dwMaxFullFrameRate < dwMaxNonSkippingRate
+
+ FF playback transitions from full-frame play, then to all keyframes,
+ then to keyframes + seekaheads. This method allows the transition
+ rates to be set. By default they are 4 and 6. If the rate is in (0,4]
+ all the frames are sent to the codec. If the rate is in (4,6] just
+ keyframes are sent. If the rate is > 6, then only keyframes are sent,
+ and a seekahead between keyframes is used that is proportionally
+ aggressive to the specified rate.
+ --*/
+ HRESULT
+ SetFFTransitionRates (
+ [in] DWORD dwMaxFullFrameRate,
+ [in] DWORD dwMaxNonSkippingRate
+ ) ;
+
+ /*++
+ ------------------------------------------------------------------------
+ GetFFTransitionRates ()
+
+ 1. gets the fast forward (FF) rates for which the Stream Buffer Engine
+ transitions from FullFrame to KeyFrame to KeyFrameWithSeeks.
+ --*/
+ HRESULT
+ GetFFTransitionRates (
+ [out] DWORD * pdwMaxFullFrameRate,
+ [out] DWORD * pdwMaxNonSkippingRate
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferMediaSeeking
+
+ Implemented on the StreamBufferSource filter. Used to seek and set the
+ playback rate.
+
+--*/
+
+[
+ object,
+ uuid(f61f5c26-863d-4afa-b0ba-2f81dc978596),
+ pointer_default(unique)
+]
+interface IStreamBufferMediaSeeking : IMediaSeeking
+{
+ // no additional methods have been added
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferMediaSeeking2
+
+ Implemented on the StreamBufferSource filter. Used to seek and set the
+ playback rate.
+
+--*/
+
+[
+ object,
+ uuid(3a439ab0-155f-470a-86a6-9ea54afd6eaf),
+ pointer_default(unique)
+]
+interface IStreamBufferMediaSeeking2 : IStreamBufferMediaSeeking
+{
+ /*++
+ -----------------------------------------------------------------------
+ SetRateEx ()
+
+ Allows the application to override SBE's trick mode seekahead
+ computation.
+
+ The specified frame rate will, on average, be correct, but may
+ have some variance if averaged over short periods of time. This is
+ due to the content's compression schema.
+
+ The frame rate is applied to the video stream, if one exists. If no
+ video stream exists, the rate call fails. The framerate parameter
+ (dwFramesPerSec) is ignored when the specified abs(rate) is less than or
+ equal to the maximum non-skipping rate (see IStreamBufferConfigure2::
+ SetFFTransitionRates ()).
+
+ Parameter Detail
+ ----------------
+
+ dRate rate at which the content is to be played.
+ valid values are all rates, excluding the following
+ range: (-0.1, 0.1)
+
+ dwFramesPerSec frames per second
+ cannot be 0
+ SBE does not enforce this parameter with respect to
+ the screen refresh rate
+ ignored if the abs(dRate) value is <= max non-
+ skipping rate (see IStreamBufferConfigure2::
+ SetFFTransitionRates ()).
+
+ Return Values
+ -------------
+
+ success S_OK
+
+ failure error code
+ --*/
+ HRESULT
+ SetRateEx (
+ [in] double dRate,
+ [in] DWORD dwFramesPerSec
+ ) ;
+} ;
+
+
+/*++
+ ============================================================================
+ ============================================================================
+ IStreamBufferDataCounters
+
+ Implemented on the StreamBufferSource & StreamBufferSink filter pins. Used
+ to get instantaneous traffic counters for the pin.
+
+--*/
+
+typedef struct {
+ ULONGLONG cDataBytes ; // total sample payload bytes
+ ULONGLONG cSamplesProcessed ; // samples processed
+ ULONGLONG cDiscontinuities ; // number of discontinuities
+ ULONGLONG cSyncPoints ; // number of syncpoints
+ ULONGLONG cTimestamps ; // number of timestamps
+} SBE_PIN_DATA ;
+
+[
+ object,
+ uuid(9D2A2563-31AB-402e-9A6B-ADB903489440),
+ pointer_default(unique)
+]
+interface IStreamBufferDataCounters : IUnknown
+{
+ // retrieves the instantaneous values in the data structure
+ HRESULT
+ GetData (
+ [out] SBE_PIN_DATA * pPinData
+ ) ;
+
+ // sets all the data structure values to 0
+ HRESULT
+ ResetData (
+ ) ;
+} ;
+
+/*++
+ ============================================================================
+ ============================================================================
+ events
+--*/
+
+// see evcode.h comment for range
+// stream buffer engine (PVR) 0x0326 - 0x0350 (sbe.idl)
+
+cpp_quote ("#define STREAMBUFFER_EC_BASE 0x0326")
+
+cpp_quote ("enum {")
+cpp_quote (" // timehole event")
+cpp_quote (" // param1 = timehole stream offset ms")
+cpp_quote (" // param1 = timehole size ms")
+cpp_quote (" STREAMBUFFER_EC_TIMEHOLE = STREAMBUFFER_EC_BASE,")
+cpp_quote (" ")
+cpp_quote (" STREAMBUFFER_EC_STALE_DATA_READ,")
+cpp_quote (" ")
+cpp_quote (" STREAMBUFFER_EC_STALE_FILE_DELETED,")
+cpp_quote (" STREAMBUFFER_EC_CONTENT_BECOMING_STALE,")
+cpp_quote (" STREAMBUFFER_EC_WRITE_FAILURE,")
+cpp_quote (" //")
+cpp_quote (" // unexpected read failure")
+cpp_quote (" // param1 = HRESULT failure")
+cpp_quote (" // param2 = undefined")
+cpp_quote (" STREAMBUFFER_EC_READ_FAILURE,")
+cpp_quote (" //")
+cpp_quote (" // playback rate change")
+cpp_quote (" // param1 = old_playback_rate * 10000 e.g. 2x is 20000")
+cpp_quote (" // param2 = new_playback_rate * 10000")
+cpp_quote (" STREAMBUFFER_EC_RATE_CHANGED,")
+cpp_quote ("} ;")
+
+/*++
+ ============================================================================
+ ============================================================================
+ trick mode
+
+ We've extended the 1.0 interfaces as follows:
+
+ 1. source filter presents timestamps that monotonically increase overtime
+
+ 2. flushes should have no effect over queued rate segments
+
+ 3. discontinuities have no effect over queued rate segments
+
+ To use the interface, continue to use AM_KSPROPSETID_TSRateChange, but use
+ dwPropId that is higher
+
+--*/
+
+#ifdef USE_AM_PROPERTY_TS_RATE_CHANGE_11
+cpp_quote ("typedef enum {")
+cpp_quote (" AM_RATE_UseRateVersion = AM_RATE_Step + 1,")
+cpp_quote (" AM_RATE_QueryFullFrameRate,")
+cpp_quote (" AM_RATE_QueryLastRateSegPTS")
+cpp_quote ("} AM_PROPERTY_TS_RATE_CHANGE_11 ;")
+
+// AM_RATE_QueryRate; this is the max full-frame rate; source filter can use
+// up to this; it can use less
+cpp_quote ("typedef struct {")
+cpp_quote (" LONG lMaxForwardFullFrame ; // rate * 10000")
+cpp_quote (" LONG lMaxReverseFullFrame ; // rate * 10000")
+cpp_quote ("} AM_QueryRate ;")
+#endif // USE_AM_PROPERTY_TS_RATE_CHANGE_11
+
+/*
+================================================================================
+AM_RATE_UseRateVersion
+--------------------------------------------------------------------------------
+Specifies the rate change version to be used.
+
+The default behavior should be per 1.0.
+
+Use a WORD value. The high-order byte specifies the minor version (revision)
+number; the low-order byte specifies the major version number. On a
+little-endian system (e.g. x86), the WORD value version for the contents of
+this specification is 0x0101.
+
+If the specified rate version is not supported, the call should fail with
+an E_NOINTERFACE error code.
+
+================================================================================
+AM_RATE_QueryFullFrameRate
+--------------------------------------------------------------------------------
+Allows a source filter to query for maximum full-frame rates the timestamp
+scaling filter is capable of. Maximum full-frame forward and reverse rates
+are queried for.
+
+Use AM_QueryRate structure. Timestamp scaling filter must set
+lMaxReverseFullFrame struct member to negative rate.
+
+The sourcing filter can still choose to set the full-frame rate to a value
+smaller than the value returned by the timestamp scaling filter. For example,
+there may be IO issues that prevent a full-frame playback, even if the timestamp
+scaling filter is capable.
+
+Non-full frame playback will consist of groups of continuous samples sent to
+the timestamp scaling filter, separated by discontinuities. The timestamps for
+each group of samples will jump across the discontinuities, but still increase
+per the RunTimePlus timeline, when compared to RenderTime, once a steady state
+runstate has been achieved.
+
+Note that Rate is used this call, vs. speed.
+
+================================================================================
+AM_RATE_QueryLastRateSegPTS
+--------------------------------------------------------------------------------
+Allows a source filter to query the timestamp scaling filter for the last-set
+rate-segment's effective PTS, regardless of rate-segment position.
+
+Note that Rate is used this call, vs. speed.
+
+================================================================================
+AM_RATE_SimpleRateChange (with 1.1 semantics)
+--------------------------------------------------------------------------------
+If the rate is to be set to the most forward sample, the
+AM_SimpleRateChange.StartTime member is set to value -1 by the sourcing filter.
+This has meaning to the timestamp scaling filter to set the rate to the most
+forward sample, and return that sample's presentation time via the method call's
+[out] parameter.
+
+If the specified rate segment is incompatible, all queued samples with PTS in
+rate-incompatible segment can be discarded.
+
+If the current rate is incompatible i.e. samples are being dropped by the
+timestamp scaling filter and it is not keeping an internal queued, it should
+fail the querying call (AM_SimpleRateChagne.StartTime = -1) with return error
+VFW_E_DVD_WRONG_SPEED. The sourcing filter will then set a rate with an
+effective PTS.
+
+*/
+