mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1072 lines
39 KiB
1072 lines
39 KiB
|
|
/*++
|
|
|
|
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 ; // get recording objects
|
|
interface IStreamBufferSource ; // associates with IStreamBufferSink
|
|
interface IStreamBufferRecordControl ; // recording control
|
|
interface IStreamBufferRecordingAttribute ; // StreamBuffer attribute creation
|
|
interface IEnumStreamBufferRecordingAttrib ; // StreamBuffer attribute enumeration
|
|
interface IStreamBufferConfigure ; // configuration interface
|
|
interface IStreamBufferMediaSeeking ; // IMediaSeeking but with different GUID
|
|
interface IStreamBufferPolicy ; // StreamBuffer policies
|
|
interface IStreamBufferInitialize ; // allows 3rd party app to set HKEY
|
|
|
|
[
|
|
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 safely with NULL parameter, but only
|
|
once with non-NULL parameter; returns E_UNEXPECTED if called more
|
|
than once with non-NULL param, or after the hosting filter has run;
|
|
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 (
|
|
) ;
|
|
} ;
|
|
|
|
/*++
|
|
============================================================================
|
|
============================================================================
|
|
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] 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] 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] 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
|
|
) ;
|
|
} ;
|
|
|
|
/*++
|
|
============================================================================
|
|
============================================================================
|
|
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
|
|
} ;
|
|
|
|
/*++
|
|
============================================================================
|
|
============================================================================
|
|
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
|
|
|
|
--*/
|
|
|
|
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 ;")
|
|
|
|
/*
|
|
================================================================================
|
|
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.
|
|
|
|
*/
|
|
|