DirectShow Playback Guide
Native DirectShow filter support was added to MC11.1 in December 2005 and has been improved dramatically with MC12. DirectShow is a multimedia API released by Microsoft which became a standard component of Windows with Windows 98. It is essentially a replacement for the earlier Video for Windows technology. In Windows Vista this technology has evolved into the Windows Media Foundation, which performs similar services. It provides developers with a unified interface across different programming languages to allow their applications to render or record media files, using a filter based framework.
- 1 What is DirectShow? What is a DirectShow filter?
- 2 What version of DirectX do I need?
- 3 Why do I need to get DirectShow filters?
- 4 How do I install DirectShow filters?
- 5 What filters do I need and where do I get them?
- 6 Advanced DirectShow Configuration in MC12
- 7 See Also
- 8 External Links
What is DirectShow? What is a DirectShow filter?
DirectShow uses the concept of “Filter Graph” to take a multimedia file on disk and turn it into what you see or hear from your computer. A filter graph is like a chain of individual “DirectShow Filters”. A filter is a software component in DirectShow that will work with other similar components to render a media file. They are sort of like little "plugins" for DirectShow that allow it to handle different types of media, different types of files, or perform transformations on the media data. Each filter in the Filter Graph chain processes audio/video data in a specific way to facilitate the playing of the media files. Filters have “pins” - points of connection between filters, both input pins and output pins. Pins are the means by which media data is passed from one filter to another filter. For example, the Input pin of the Haali Media Splitter will receive the data from the file, split it to it's component parts and then output those "streams" via it's output pins. FFDSHOW will then connect it's input pins to Haali's output pins and decode the video stream.
You can use the free GraphEdit utility from Microsoft to manually build filter graphs if you want to play around with how this works.
Generally speaking, there are three types of filters in terms of functionality: Source filters, transform filters, and renderer filters.
With most media files, it is important to understand the distinction between the file container format and the individual media stream formats (sometimes referred to as the codec of the file) "contained" inside the file. The container format is essentially the file you see on your hard drive (the AVI, MKV, MP4, OGM, or whatever) which is used to identify and interleave the different "stream" types that make up the actual media, including metadata tags, video streams, audio streams, subtitles, and other information.
To play back a file properly via DirectShow you always need at least a Source Filter and a Render filter. Usually you need both a Source Filter, one or more Transform filters, and one or more Render Filters. The Source Filter (often referred to as the Splitter Filter) reads the file container format and splits out the different "streams" of data contained within. This data is usually then passed over to a set of Transform filters which decode the data streams. These Transform filters are often called Decoder Filters, or Codecs (which stands for enCODer/DECoder). The Transform filters decode the different media streams (including audio, video, and metadata, such as subtitles). Generally you'll need one decoder filter to process each "stream type" that comes out of the Source Filter (though many, like FFDSHOW, handle more than one type of stream). They then pass the raw decoded data to the Render filters which transforms the uncompressed raw data into what you see on screen and hear through your sound device.
Sometimes these lines blur, when a particular filter can act as both a splitter and a decoder filter (such as FFDSHOW), or Haali which also processes and decodes some of the data streams (subtitles for example).
A Source Filter is a component that loads a media file for playback used to decode the container file format and extract the actual audio, video, metadata, and subtitle streams (among other information). They are usually somewhat specific to the file container type (though many Source filters handle multiple types). The most basic source filter simply loads a file and passes the stream contained in the file to downstream filters for further processing, but some source filter would act as a “splitter”, by parsing the data into separate audio and video streams and then pass them down to other filters. Examples of source filters are “File Source” which reads data from a file, “TV tuner filter” which tunes to a TV channel, and “DVD navigator filter” which reads data from a DVD disk. Another example is the Haali Media Splitter, which can decode MP4, AAC, and MKV files (among others).
A transform filter is a filter that accepts media data from an upstream filter, processes the data, and then passes the data to a downstream filter. Therefore a transform filter must have both input and output pins (there may be more than one set of input and output pins on a given filter). An input pin connects to the output pin of an upstream filter (such as a source filter, which generally has only output pins). An output pin on a transform filter connects to an input pin of a downstream filter , such as a renderer filter, which has only input pins, or another transform filter. Transform Filters are often called Decoder Filters or CODECS.
You don't always need to have a Transform filter in your render graph. For example, playing back a WAV file doesn't require a Transform/decoder filter, because the WAV format can be rendered directly by the Render Filter. The same goes for uncompressed video inside an AVI. Just because you don't need one, doesn't mean you can't however. It can be useful to use Transform filters to actually perform post-processing on media data. For example, you can use the FFDSHOW Video Decoder to do noise reduction, sharpening, and de-interlacing, among other processing tools. The FFDSHOW Audio decoder can process audio data for AC3 and DTS decoding, downmixing (and upmixing) multichannel audio, volume correcting, resampling, cleanup, and all sorts of other effects. These effects are available even for uncompressed audio and video -- you simply need to tell FFDSHOW to handle those media types.
Examples of Transform filters are the FFDSHOW MPEG-4 Video Decoder (ffdshow.ax), XviD Video Decoder (xvid.ax), the Microsoft MPEG Audio Decoder (quartz.dll), and DirectVobSub (VSFilter.dll).
A renderer filter is a component that renders a media stream, and is thus the last stage in DirectShow filter graph. For example an audio renderer is one that sends audio data to a sound card. A video renderer displays video to your computer screen. There are also renderers that can send files onto disk and into files. They are all usually very general purpose, accepting raw data.
How DirectShow Decides Which Filters to Use
MC supports a number of audio file types natively. When you play back a MP3 file, for example, MC uses it's own internal high-quality filters to split and decode the file and send it to the appropriate output device (sound card). When you attempt to play a file back in MC that it doesn't support natively, MC tries a number of different things to get the file to play. The first step is to attempt to render the file using DirectShow.
By default, if you haven't modified the DirectShow playback configuration options in MC, and you play a file back, it simply asks Windows to build the regular DirectShow graph. This works the same as Windows Media Player and any other DirectShow player does when playing back a file.
The default graph is built based on two factors: a) each individual filter "tells" DirectShow what kinds of media streams it is able to render, and b) DirectShow assigns (or more precisely, the filters assign to themselves when you install them) a priority number called its "merit score".
When you play a file, DirectShow attempts to build a chain of filters capable of decoding the content based on these two pieces of information. It tries filters matching the stream type, in the order of which filter has the highest priority first. If the "render" fails, then it tries the next highest priority set, and so on and so forth until it runs out of options or succeeds. Just because it "works" doesn't mean it's necessarily finding the "best" filter graph. It just uses whichever one it "bumbles" into that works first.
MC's DirectShow Playback settings dialog overrides the priority part of this sequence of events. If you select one or more of those filters, it overrides the normal merit score system (perhaps by temporarily elevating them to the highest possible Merit -- I'm not sure of the details of this mechanism). So, you can force it to "try" to use a different filter to play a file back, but you can't force it to use one or fail outright. If that graph fails (the output pins can't connect to the input pins to build a complete render graph) then it either ignores certain selected filters, or it fails over completely to the default graph. (MC's DirectShow Playback Settings dialog provides essentially identical functionality to ZoomPlayer's "Smart Play" feature.)
I've simplified this a bit for the sake of explanation, but that's the general idea of what happens when you try to play a file back via DirectShow.
What version of DirectX do I need?
In order to play media using DirectShow, you must have Microsoft DirectX installed. We recommend DirectX 9.0c to take advantage of features that are available only in late versions. While technically DirectShow itself was removed from the larger DirectX package in April 2005 (and moved to the Microsoft Platform SDK instead), MC still makes use of many DirectX features and it is still critical to ensure that you have installed the most current version of DirectX on your system.
DirectX 9.0c is included as part of the Windows XP Service Pack 2 update, so if you are running Windows XP SP2 it is likely that version is already installed on your computer, and you do not need to do anything in most cases. For earlier versions of Windows operating system, we recommend you download it from Microsoft website and install it.
Windows Vista ships with DirectX 10, which Microsoft says will not be made available for older versions of Windows. DirectX 10 has been completely overhauled from earlier versions. Like all versions of DirectX, it is completely backwards compatible with older versions of DirectX. If you are running Windows Vista, DirectX 10 is what you want to have!
To check which version of DirectX is installed on your computer using the dxdiag tool, please refer to Microsoft KB Article 157730.
Why do I need to get DirectShow filters?
In short, you don't need to but you'll probably want to! The entire purpose of DirectShow is to allow the system to easily expand to support new media types through the "plug-in" Filter architecture.
In order to play media files in DirectShow, one must have DirectShow filters that can handle the media types to be played. DirectShow comes with some of the filters that are needed, for example video and audio renderers and MPEG-1 filters. DirectShow, however, does not include all filters that are needed to handle common (and more modern) media types. So, you must make sure you have appropriate filters for the file types you want to play. DirectShow filters come from a variety of sources. We do not, and can not, include all filters that are needed in Media Center‘s installation. In most cases you will need to install decoder filters from other sources. For example in order to play DVD on your computer you must have DVD capable MPEG-2 video decoder, and audio decoder(s) that are capable of decoding MPEG-2 audio and/or AC3 audio formats.
Some computers do come with certain filters installed by the computer vendor. However, the filters preinstalled may not be top-notch filters. In such case it is to your advantage to find and install better filters..
How do I install DirectShow filters?
It depends on the filter. Some filters come with an installation program. You just need to execute the program, and the installation wizard will guide you through the process. Most filter packs are installed this way, via the standard "setup.exe" Windows software installation motif. Then, to remove them, you just go the the standard Add/Remove Programs Control Panel and proceed normally.
Unfortunately, not all filters come with an installation wizard. Instead they are just one or more files with file extension .ax or .dll, often contained in an archival file (ZIP or RAR). In such a case, you first need to extract the file(s) into a folder where you'll be able to find them using a program like ZipGenius or WinZip. Any folder is fine, really, but I like to use C:\Program Files\DirectShow_Filters\ (because it's then easy to find the filters later if I need to uninstall or update them).
Once you've extracted the filter files to an appropriate folder, you then need to register the filter using the Windows program Regsvr32.exe. This program exists on every Windows computer in your System32 directory (inside the Windows folder). To do this, simply call the regsvr32.exe program and give it the path to your new filter as its command line argument.
For example, if you downloaded a filter whose file name is NewFilter.ax, and you placed the file in “C:\Program Files\DirectShow_Filters\“, you can register it by going to the Start button and choosing “Run”. Then enter the following line (including quotes) in the box that appears:
regsvr32.exe "C:\Program Files\DirectShow_Filters\newfilter.ax"
When you click OK a dialog box should pop up saying "DLLRegisterServer in C:\Program Files\DirectShow_Filters\newfilter.ax succeeded", indicating that the filter is now registered with the system. That's it! You've now successfully installed the filter.
NOTE: Some filters may come with two versions of them, a Unicode version and a non-Unicode verion. You should register the Unicode version as Media Center supports Unicode.
If you ever decide you don't need a particular filter anymore, you can also unregister a filter in much the same manner, by using the command line parameter /U. For example to unregister the filter registered in the above example, you issue this command:
regsvr32.exe /U "C:\Program Files\DirectShow_Filters\newfilter.ax"
In this case you will get a confirmation saying “DllUnRegisterServer in C:\Program Files\DirectShow Filters\newfilter.ax succeeded.” You are then free to delete the filter file(s) from your system.
What filters do I need and where do I get them?
The answer depends on what media format you want to play. In general you will need decoder filters and, in many cases, you will also need splitter filters. You can obtain commercial filters from various vendors. You can also get free, open source, filters. In this guide we will tell you about some free filters.
Before getting to individual media formats, it is a good idea to introduce/recommend CCCP, a multi-filter and multi-format decoder package. If all you want is for your video and audio files to work reliably, with a minimum of effort (and no money), then CCCP is probably the way to go.
CCCP - Combined Community Codec Pack
This is a great multiple-filter pack that provides filters for playback of most media formats, including DVD. At the heart of CCCP is FFDSHOW, which is a general purpose DirectShow filter that can be used to decode a large number of media formats. CCCP also includes quite a few other major components, including: MPV video decoder (decodes DVD and other MPEG-2 video), and Haali Media Splitter (handles decoding MP4, MKV, M4A, and a number of other container formats).
This "pack" is probably the single simplest method to get the vast majority of file types to play back properly and reliably. There are a few file types that CCCP does not support out of the box, including Quicktime, RealMedia, and FLV video (though it tries at FLV). Adding support for these file types is described below, though the CCCP Project site has much more information on this topic.
Make sure you read the instructions before installing CCCP. As a general rule, you should uninstall any previously installed codec packs, as different codec packs often conflict with each other. You should also uninstall previously installed individual filters that CCCP includes, such as FFDSHOW, Haali Media Splitter. This way you will be sure that CCCP can install and configure the filters properly.
Additionally, when installing CCCP, make sure you uncheck the option to install FLV Splitter. The version of FLV splitter included with CCCP does not work well. See "FLV" below.
DVD and MPEG-2 Playback
- further information: DirectShow Playback Guide: DVD and MPEG-2
For DVD playback, you need DVD capable MPEG-2 video decoder and a MPEG-2 / AC3 audio decoder. These filters may or may not already exist on your computer. Some computers come with filters for DVD; some do not. Filters may also come with installation of some third-party software. If you do not already have the needed filters, you may need to install them. Commercial decoders are available from various vendors. Free decoders are available and described below.
Again, CCCP fully supports DVD Playback out of the box. The simplest free method to enable DVD Playback support is to just use CCCP.
If you'd prefer not to use CCCP, or if you have special needs, there are a wide variety of other Filters available that can handle DVD playback. Some of these alternative options, if properly configured, can provide absolutely stunning playback quality which meets (and often exceeds) the quality available from the best set-top upscaling DVD Players commercially available. Check the DirectShow Playback Guide: DVD and MPEG-2 page for further information.
Additional Useful Filters
As mentioned above, CCCP does not include each and every filter you could possibly need to have in order to support your media. The best place to look for more information is on the CCCP Wiki page describing Unsupported Formats. However, here are a few of the big ones:
RealAlternative is a free, open source implementation of the Real playback engine, which handle Real Media file types without having to install the "real" RealPlayer. It is essentially a set of DirectShow filters that allows DirectShow to natively handle RealMedia files. Please note: When installing RealAlternative, you don't need to install MPC again as it's included as part of CCCP (so you can deselect that option during the install).
MC uses Quicktime as its "fallback" rendering engine if DirectShow playback fails. So, it's a good idea to have Quicktime installed even if you don't use any Quicktime Media. Quicktime Player is available for free from Apple. You do not need to choose the version that includes iTunes -- there is still a standalone player version available.
If you choose to install the "real" Quicktime, make sure to manually de-select all the file type Associations possible during the install so it doesn't take over your media files. You can also disable the task tray icon under Edit --> Preferences --> Quicktime Preferences --> Advanced tab --> Install QuickTime icon in system tray from inside Quicktime.
Similar to RealAlternative You can also choose to install QuicktimeAlternative instead of the "real" Quicktime. This will allow Quicktime MOV files to play back via DirectShow. If you choose the Alternative, same as RealAlternative, you don't need to install MPC, as it's included in CCCP.
It is actually a good idea to install at least the Splitter portion of Quicktime Alternative, even if you use the full, Apple version of Quicktime. This will allow your Quicktime MOV files to play back in regular DirectShow applications. MC can handle Quicktime files with, or without, QTAlternative installed.
FLV, flash video, is a format widely used for streaming. For example Google video and YouTube use this format. This format should play correctly in Media Center without user actions. However, if you do have problem playing them, you need to make sure the following filters are properly installed and configured.
To decode the Flash Video Codec: FFDSHOW
You need to configure it so it will decode FLV video. Media Center should configure it for you automatically, but here is how you can do it manually:
Start -> All Programs -> FFDShow (or Combined Community Codec Pack) -> FFDShow Video Decoder Configuration. Choose "Codecs" from the top of the left panel. On the right panel, find FLV1 in the first column ("Format"), and change the value in the second column ("Decoder") from "disabled" to "libavcodec". Click OK.
Note: The latest CCCP also includes a version of FLVsplitter that does not work with Google/YouTube videos. You should use the version linked here (built by Celtic Druid), which, in addition to being able to play FLV1 videos from Google/YouTube when used with FFDShow, also includes an FLV Video Decoder filter which decodes FLV4 format (FFDShow decodes FLV1).
Alternative Source and Transform Filters
- further information: DirectShow Playback Guide: Alternative Filters
While CCCP is the easiest way to get your system working, there are alternatives of course. For more information on many of the available alternatives, please read the DirectShow Playback Guide:Alternative Filters page.
Some of these alternatives include: FFDSHOW (standalone), DivX and XviD, CoreAVC, and some hardware accelerated filters. There is also information included on filters required to handle new and modern File Container formats such as MP4, M4A, MKV, and OGM. Many of the components listed are the same ones included as part of the CCCP set. These are all available separately though and can be mix-and-matched on your own for advanced purposes.
Advanced DirectShow Configuration in MC12
As mentioned previously, J. River MEDIA CENTER 12 includes a number of new features which greatly expand your ability to customize the behavior of the DirectShow filters used to render your media files. Most of these new features can be found in the DirectShow Playback Options dialog. This dialog can be found by going to: Tools --> Options --> Playback --> Video--> DirectShow Playback Settings. The dialog pictured below is where much of the power lies.
DirectShow Playback Options
On the right hand side of the dialog is the DirectShow filters list. The primary purpose of this list is to allow you to enable and disable DirectShow support based on what type of file it is. If the box next to the given file type is checked, MC will attempt to decode any files you play of that type via DirectShow. Conversely, if the box is unchecked, then MC will try to render the file via other means (often via Quicktime).
Note: I am not clear on what happens here. I know that MC will "fall back" and use Quicktime in many circumstances, but is there anything else that it tries (like the WMP Engine for example)? What happens if you uncheck a box that isn't supported by Quicktime -- does the file just fail to play then?
More importantly, if you select one of the file types and hit the Select Filters button, it opens a new dialog where you can configure the specific filters that you'd like MC to try to use to render whenever it plays that particular file type. This dialog is pictured on the right.
You can in this dialog, you can choose a Source Filter (maximum one), and one or more Other Filters (which are mostly just Transform decoding filters). You may choose more than one Other Filter and MC will try to render a graph using all of them. While I am not clear on the exact mechanism used to do this internally, MC essentially overrides the Merit score on the filters you choose here when a specific file type is played back. This is far more powerful than is available via modifying the Merit Scores for filters directly, because a particular filter only gets one Merit score, but may be able to handle many different file and codec types.
Please bear in mind, this dialog does not force DirectShow to use only the filters you have selected and no others. This dialog is more of a way to force DirectShow to try your particular set of filters to render the file first. As usual, if that filter combination fails (the input pins can't connect to the output pins in the graph), then DirectShow will take over and build the default graph and try to play the files. You also do not need to select both a Source and an Other filter. If you select only one component (or no components) then DirectShow will also build the default graph and render the file, but it will try to use any filters you selected first (though often these filters go together in "sets" so it may be more effective to do so).
In this same dialog, you can choose which Video Renderer to use to try to play back the file type from three choices: VMR9, VMR7, and Legacy Video Renderer (Overlay).
I'm not clear on if MC will offer EVR as a rendering option on Windows Vista. Does anyone using Vista mind checking and adding this information if it does?
Again, all of these options will be applied only to the specific media type that you had previously selected when you hit the Select Filters button in the DirectShow Playback Options dialog box.
Filter Configuration During Playback
You can also configure and work with these filters as actively while the files are playing back by right clicking on the image in Playing Now or Display View and choosing DirectShow Filters presents you with a pop-out menu which lists each of the filters being used in the current graph (in order with the Source Filters on the bottom and the Render Filters on the top of the stack.
From here you can select any of the presented filters and MC will launch that filter's UI. These UI's typically either display an informational dialog (showing frames played and stream information), but with many filters you can make all kinds of adjustments (such as FFDSHOW). Many of these adjustments work "live" (meaning that they are applied on the fly while the video is playing back. You can also choose Select Filters and configure the filters that will be used for this file type (you may have to stop and re-start playback for this to take effect).
- DirectShow Playback Guide:Alternative Filters
- DirectShow Playback Guide: DVD and MPEG-2
- DTS_WAV Playback Support
- Audio Formats
- Video Formats