/*++ 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. */