Although IMediaPosition allows applications a simple seeking interface on a filter graph, it has a number of limitations. The IMediaPosition interface allows seeking only by using REFTIME time-based units; however, many filter graphs would prefer to seek on units of samples, video frames, or fields in a compressed stream. Also, the IMediaPosition interface uses separate methods to set and retrieve position properties, which can cause unnecessary filter flushing.
The IMediaSeeking interface improves on the IMediaPosition interface by allowing arbitrary formats for seekable units, such as frames, bytes, and 100-second units of time. It also offers the ability to start and stop times using a single method call, which is absent in IMediaPosition. When seeking to time units, IMediaSeeking expresses time as a 64-bit integer (LONGLONG), providing greater accuracy than IMediaPosition, which expresses time in decimal seconds stored as a double. However, because of this difference in time unit data types, only IMediaPosition supports Automation. IMediaPosition is maintained as an interface for this reason only. Applications not using Automation to seek the media stream should use the IMediaSeeking interface instead.
The IMediaSeeking interface is set by using a defined time format, such as TIME_FORMAT_MEDIA_TIME or TIME_FORMAT_SAMPLE, which then defines how parameters in other methods are interpreted. The format can be changed only when the filter graph is stopped (the default DirectShow plug-in distributor method for this method takes care of this automatically, effectively eliminating this restriction). Only one time format is available at any given time.
When a filter is seeked in media time, it must return a time at which the media seek positioned it. For example, if a source filter is seeked to frame 30, it might return 2 seconds if the video is 15 frames per second. With that position time (of 2 seconds), the filter graph manager can then seek all the other filters to that 2-second position so that the graph as a whole remains synchronized.
Time formats are globally unique identifiers (GUIDs), which are defined as follows.
When to Implement
The filter graph manager exposes the IMediaSeeking interface from the plug-in distributor (PID) that handles this interface. If none of the filters within the graph support this interface, the PID will return E_NOINTERFACE; if at least one filter supports the interface, but all such filters return E_NOTIMPL, the PID will return E_NOTIMPL. Otherwise, the filter graph manager will return either a success or the first failure it encounters.
A success normally means that a seekable file source filter was found. Filters, such as a file source filter, will expose IMediaSeeking if they can seek their data or if their output pin represents a seekable stream. The renderer filter also should expose this interface. Output pins of transform filters expose this interface to pass the positioning information upstream, from the renderer through each intermediate filter to the seekable filter.
Use the CPosPassThru base class to implement this interface on output pins of transform filters used to pass media positioning information upstream. This is enabled by default in the pin base classes. Renderers can use the same class, although in most cases they should use CRendererPosPassThru, which is derived from CPosPassThru, to implement this interface.
When to Use
Applications can use this interface to set or retrieve properties such as the duration of the stream, the current position, the stop time, and the media time format being used. Most commonly, an application will use the methods on this interface to play a media stream for some duration starting at some set position in the stream (for example, 10 seconds from the start).
A transform filter will call the IMediaSeeking methods on the connected upstream pin when passing media times upstream from the renderer.
Methods in Vtable Order
The following table shows the methods that appear in the Vtable beneath the standard COM methods inherited from IUnknown.
|GetCapabilities||Returns the seeking capabilities of the media stream.|
|CheckCapabilities||Determines which capabilities exist on a media stream by applying seeking capability flags and checking the returned value.|
|IsFormatSupported||Determines if a specified time format is supported.|
|QueryPreferredFormat||Retrieves the preferred time format to be used by the interface.|
|GetTimeFormat||Retrieves the current time format.|
|IsUsingTimeFormat||Determines if the time format being used in the call is the same as the one currently in use by the interface.|
|SetTimeFormat||Sets the time format, which determines the format of units used during seeking.|
|GetDuration||Retrieves the length of time that the media stream will play.|
|GetStopPosition||Retrieves the position within the media stream at which playback should stop.|
|GetCurrentPosition||Retrieves the current position within the media stream.|
|ConvertTimeFormat||Converts a time from one time format to another.|
|SetPositions||Sets current and stop positions and applies flags to both.|
|GetPositions||Returns the current and stop position settings.|
|GetAvailable||Returns the range of times in which seeking is efficient.|
|SetRate||Sets a new playback rate.|
|GetRate||Returns the current rate.|
|GetPreroll||Retrieves the preroll settings.|
DirectShow applications and DirectShow filters have different include file and link library requirements. See Setting Up the Build Environment for more information.
OS Versions: Windows CE 2.12 and later. Version 2.12 requires DXPAK 1.0 or later.
Last updated on Wednesday, April 13, 2005
© 2005 Microsoft Corporation. All rights reserved.