blob: fd48a9fbeeec7a8b52ff4455f85a8b8e19035959 [file] [log] [blame]
WebM Project DirectShow Filters
v0.9.10.0 - 2010/08/09
http://www.webmproject.org/
mailto:matthewjheaney@google.com
Summary
The WebmM Project DirectShow Filters package ("webmdshow") allows you
to encode and decode VP8 video, and write and read WebM files, all using
Microsoft DirectShow.
Preliminaries
A website has been set up to host artifacts associated with the WebM
project:
http://www.webmproject.org/
The actual download page is here:
http://code.google.com/p/webm/downloads/list
Look for the "webmdshow-..." link to find the latest version of the
filters.
Some mailing lists have been set up to discuss WebM-related issues.
The main page is here:
http://www.webmproject.org/about/discuss/
That page has instructions for subscribing to the lists. The actual
lists are hosted here:
http://lists.webmproject.org/
http://groups.google.com/a/webmproject.org
If you find a bug, or there's a feature you want, then please file a
report using the WebM issue tracking system:
http://www.webmproject.org/code/bug-reporting/
You can browse existing issues here:
http://code.google.com/p/webm/issues/list
You can create a new issue here:
http://code.google.com/p/webm/issues/entry
If you are a developer and would like to build from sources, then
you can use Git to clone the origin, like this:
git clone git://review.webmproject.org/webmdshow.git
Installation
A DirectShow filter is a "COM InProc Server DLL", and so it needs to be
registered with the system. The delivery artifacts should include a file
named "install_webmdshow.exe". Run that installer (either from a command
prompt, or from a Windows Explorer shell) and it will automatically
register the filters on your system. The DLLs are placed in the following
directory:
C:\Program Files\Common Files\WebM Project\webmdshow
To uninstall, you can choose the uninstall option from the Add or Remove
Programs control panel, or run the uninstall_webmdshow.exe in the install
directory listed above.
The webmdshow package also includes a couple of simple command-line
utilities for reading and writing WebM files, that are implemented using the
Webm DirectShow filters. The utility PLAYWEBM (playwebm.exe) is for basic
testing and playback of WebM files, and the utility MAKEWEBM (makewebm.exe)
is for simple creation of WebM files. They are not automatically installed
by the installer, so if you'd like to use them, just extract them from the
archive and place them in your path.
Description of Microsoft DirectShow and the WebM DirectShow Filters
Microsoft DirectShow is a framework for manipulation of media streams on
Windows. Streams are constructed from "filters" that are connected via
"pins". You mix and match different kinds of filters in order to construct
a stream having the characteristics you desire.
A WebM file is a container for a video stream encoded as VP8, and an audio
stream encoded as Vorbis. The file itself uses the ".webm" file extension.
The file format is a subset of the Matroska container format, with "webm"
as the DocType.
In order to play back WebM files in a DirectShow-based media player (such
as Windows Media Player), you need a "source" filter that understands the
format of the file, and "decoder" filters for each stream.
When a media player attempts to render a file using DirectShow, it looks
at the file extension to determine whether a source filter has been
specifically associated with that extension. When the WEBMSOURCE filter
(webmsource.dll) is installed, it registers itself as the source filter
for ".webm" files, so if things are working normally, an instance of that
source filter will be created automatically by the DirectShow graph builder,
and the filter will then load the file.
(Note that this association of a file extension with a DirectShow source
filter is distinct from the association of a file extension with a
rendering application. The former is controlled by DirectShow, and the
latter by the Windows shell.)
The source filter exposes as many output pins as there are streams in the
WebM file. This will typically be one VP8 video stream and one Vorbis
audio stream. The WebM VP8DECODER filter (vp8decoder.dll) decodes the
VP8 video stream, which should be all you need for video rendering.
To render the audio stream, you'll need a filter that can decode Vorbis
audio. I usually just use the FFDShow filter, which is included in the
Windows Essentials Codec Pack:
http://www.mediacodec.org/
The WEBMMUX filter (webmmux.dll) creates ("multiplexes") WebM files. It
accepts a VP8-encoded video input stream and a Vorbis-encoded audio input
stream. The VP8ENCODER filter (vp8encoder.dll) is used to encode the video,
and is connected directly to the WEBMUX filter.
You'll need a filter to compress the audio stream to Vorbis. You can
try the filters available from Xiph.org:
http://xiph.org/dshow/
It might be useful to have all the filters (both video and audio) necessary
for Webm muxing and demuxing together in one downloadable package. If you
think that this would be of interest to the WebM Project community, please
file a bug report at the link listed above.
Playing WebM Files on Windows using DirectShow
Once you have installed the WEBMSOURCE filter, VP8DECODER filter, and
a Vorbis decoder filter, then you should be able to play WebM files in
any DirectShow-based media player, such as Windows Media Player.
If you're familiar with DirectShow, you can also build filter graphs
using GraphEdit or GraphStudio. (GraphEdit is part of the Windows SDK.)
The friendly-name of each filter begins with "WebM", so they're listed
all together in the filter list dialog.
The webmdshow package also includes a command-line application called
PLAYWEBM (playwebm.exe) for simple playback of WebM files. In particular
it is useful for determining whether the necessary DirectShow filters
for rendering WebM files have been installed on your system. If you
can successfully play back the WebM file using PLAYWEBM, then that
usually indicates that the file can be played back by any other
DirectShow-based media player.
The PLAYWEBM command-line swiches can be specified using either short-form
(single hyphen) or long-form (double hyphen) syntax. Long forms are
case-insensitive and may be abbreviated. Long forms can also be specified
using Windows-style (forward slash) syntax.
If you need help, use the --help (or -h) switch, or simply run the
app without specifying any arguments. For more detailed information,
use the --help switch in combination with the --verbose (or -v) switch.
The WebM input file can be specified as the (only) command-line argument,
or as the value of the --input (or -i) switch. If you do not specify
any other switches, PLAYWEBM uses IGraphBuilder::RenderFile to build the
graph automatically. This most closely mimics what other, more general
DirectShow-based players do to render an arbitrary file (so it's a good
test of whether your system has been configured correctly).
If you use the --source (or -s) switch, PLAYWEBM will explicitly create
an instance of the WEBMSOURCE filter, load the file using that filter,
and then render each output pin.
With the --splitter (or -S) switch, PLAYWEBM will load the file using
the AsyncReader filter, explicitly create an instance of the WEBMSPLIT
filter, connect the two filters and then render each output pin.
If you specify the --list (or -l) switch, the app will print the values
of the command-line arguments, and then immediately terminate. With the
--verbose (or -v) switch also specified, the app expands the input file
name to its full path value.
Whenever you're in doubt, always try the --list and --verbose options
together, to verify that PLAYWEM has interpreted the command-line
argument values as you have intended.
The --version (or -V) switch is used to print the value of the
app's version. If you have a problem with PLAYWEBM, please include
the app's version value in your bug report.
Authoring WebM Files On Windows Using DirectShow
The webmdshow package includes a VP8 encoder filter and a WebM muxer
filter, which enable you to create WebM files by transcoding files
that are formatted or encoded differently. (A Vorbis encoder filter
is also available from Xiph.org, as explained above.)
The package also includes basic utility, MAKEWEBM (makewebm.exe),
that uses those filters to create WebM files. If you have all the
requisite filters for parsing input files and decoding streams,
then the application should just work. Specify the name of the
input file on the command-line and MAKEWEBM will make a WebM file
with the same basename but with extension ".webm", like this:
$ makewebm xyz.avi
This creates file xyz.webm.
The MAKEWEBM app has a few command-line switches to modify its
behavior. The switches are described here, but you can always
get the list by running MAKEWEBM without any arguments, or by
specifying the --help (or -h) switch.
Switches can be specified using short-form syntax (preceded by
a single hypen), long-form syntax (preceded by a pair of hyphens),
or using Windows-style syntax (preceded by a forward slash).
Switches and arguments and can be specified in any order. Switches
can be abbrievated, and long-form options are case-insensitive.
The value for long-form switches can be specified as part of the
switch itself by separating the switch from the value using an
equal sign. If no equal sign is present, then the value stands
by itself as the next command-line argument. For example:
makewebm --input=XYZ.AVI ...
makewebm --input XYZ.AVI ...
The value for Windows-style switches can be specified as part of
the switch itself by separating the switch from the value using
a colon. If no colon is present, then the value stands by itself
as the next command-line argument. For example:
makewebm /input:XYZ.AVI ...
makewebm /input XYZ.AVI ...
Short-form switches that accept a value require that the value
appear as the next command-line argument. The reason is that you're
allowed to use a long-form spelling for some switches, for example:
makewebm -i XYZ.AVI ...
makewebm -input XYZ.AVI ...
Where there is ambiguity among switches (e.g. "/ver"), the precedence
of switches is determined by their order in the help (usage) display.
MAKEWEBM requires that the input filename be specified. The input file
can be specified using the --input (or -i) switch, or as the (first)
argument.
The output file can specified using the --output (or -o) switch,
or as the (second) argument. This names the resulting WebM file.
If you don't specify the output filename value explicitly, its value
is synthesized from the input filename value. So the following commands
are all equivalent:
makewebm -i xyz.avi -o xyz.webm
makewebm -i xyz.avi xyz.webm
makewebm xyz.avi -o xyz.webm
makewebm xyz.avi xyz.webm
makewebm -i xyz.avi
makewebm xyz.avi
MAKEWEBM only transcodes input streams if they aren't encoded as
VP8 (for video) or Vorbis (for audio). If a stream already has
that encoding, then it is connected directly to the WEBMMUX filter
as is, without being re-encoded.
If MAKEWEBM needs to encode to Vorbis audio, and it cannot find a
filter to perform the encoding, then by default it will make a
WebM file without audio. If you want the app to terminate if it
cannot also encode the audio stream, then specify the
--require-audio switch.
The --list (or -l) switch will print the values of the command-line
arguments and switches, without building the actual graph. If you
also specify the --verbose (or -v) switch, the input and output
filenames are expanded to their full paths.
If you specify the --verbose (or -v) switch (without also specifying
the --list switch), then as the graph is being built the app prints
the media subtype and format of the pins being connected. This is
helpful for determining exactly how the input streams are encoded.
The --version (or -V) switch prints the value of the app's version
resource. If you submit a bug report, please include the version
value of your copy of the MAKEWEBM app in your report.
By default, while MAKWEBM is running, it prints the progress of the
mux by over-writing the same line on standard output. (The value
it writes is the current position in the output file, expressed as
time, in units of seconds.) This behavior can be changed by
specifying the --script-mode switch, which causes progress to be
written to standard output on a new line each time, and in a format
that is easily parseable. This switch is intended to be used when
MAKEWEBM app is being called from within a script that is capturing
text written to standard output by the app. See the comments at
the top of the script VBSMAKEWEBM.VBS that accompanies the delivery
artifacts for an example of how to use this option.
The VP8ENCODER filter (vp8encoder.dll) has a custom IDL-based interface
that enables you to configure the encoding. MAKEWEBM includes several
command-line switches that allow you to manipulate the VP8ENCODER
filter. Run the MAKEWEBM app with the --help switch to get a complete
list of switches. The switches for VP8 encoding match the method names
in the IDL file for the VP8 encoder. See the file "vp8encoder.idl"
among the delivery artifacts (it's in the IDL folder of the source
tree) for a full description of each configuration parameter.
VP8 Encoder Filter Notes
The VP8 encoder filter (as with the VP8 encoder library) only accepts
YUV formats as input. If you have a file or capture device with
RGB as output, you'll need a separate filter to convert from RGB to YUV.
The ffdshow filter will do such a conversion, but it might be disabled
by default. To enable it, open the Properties page for the ffdshow
Video Decoder filter, and under the Codecs menu, find the Raw video item.
Change the Decoder option so that it's not "disabled" (the values
"all RGB" or "all supported" both seem to work), and then an instance
of that filter will be created automatically when RGB-to-YUV conversion
is required.
The VP8 encoder also has a property page, so if you're using GraphEdit
or similar you can modify encoder settings that way. It works as follows.
The filter has a settings cache. When you make a change to a settings
value (via the IVP8Encoder interface), this actually changes the value in
the cache. If the graph is stopped, then the settings are applied only
later (and automatically), during the transition from stopped to paused or
running. If the graph is not stopped (and you're using the IDL interface
directly), then you must apply the settings by calling
IVP8Encoder::ApplySettings. The only settings that are actually applied
are those settings that have a value that is not "out-of-band", which
typically means equal or greater than 0. For settings that haven't been
set (the cached setting still has its default out-of-band value, -1), then
the encoder uses the default supplied by the vpx encoder library itself.
When the property page is first loaded, it queries the cache and displays
any non-default settings. Edit controls and combo boxes for settings
that have a default value are left blank. When you click on the OK or
Apply buttons, the property page modifies the cache settings that
correspond to controls with non-empty values.
The Clear button on the property page dialog window simply clears
all of the edit controls. If you were to Apply the values on the
page in this state it would have no effect, because there are no controls
with non-empty values. This is useful if you want to selectively change
a value without disturbing values that already exist in the cache.
The Reload button re-initializes the controls on the dialog window, the
same as if the property page had been dismissed via the Cancel button
and then immediately re-created. This is useful if you've made changes
to the dialog but decide to throw the values away and start over.
The Reset button calls IVP8Encoder::ResetSettings to re-initialize
all of the settings in the cache to their default (out-of-band) values,
and sets the controls to empty values. This has the effect of throwing
away settings in the cache and starting over.