The purpose of this is to provide step by step instructions on getting DVD movies to play in Linux. I will try to be as clear as possible, but if something is confusing or incorrect, please tell me about it and I'll fix it. If you have any questions, you can subscribe to the livid-dev mailing list by sending a blank email to livid-dev-subscribe@linuxvideo.org.
This howto is available in many formats, including html and tex. The newest version can always be retrieved from my site at http://helo.org/dvd/howto/. It is highly recommended that you get the most recent version, as this howto is being updated quite often.
This manual may be reproduced in whole or in part, without fee, subject to the following restrictions:
Exceptions to these rules may be granted for acedemic purposes: Write to the author and ask. These restrictions are here to protect us as authors, not to restrict you as learners and educators. Any souce code (aside from the SGML this document was written in) in this document is placed under the GNU General Public License, available via anonymous FTP from the GNU archive.
Thanks to the authors of oms and the rest of the LiViD developers, who have given the project much of their time and work, and also to those individuals who have given me feedback to make this HOWTO better.
Much of the layout of this HOWTO was gotten from the HOWTO-HOWTO, written by Mark F. Komarinski. It can be found at http://www.linuxdoc.org/.
Any translations of this document that I recieve go into http://helo.org/dvd/howto/trans/. If you would like to translate this howto, please email me at nkr@helo.org.
This HOWTO assumes you have:
First things first, you need to get a kernel with MTRR (more on this later) and DVD ioctl support. While MTRR's have been in the kernel since 2.2.11 (correct me if I'm wrong), you will probably need to update your kernel to get DVD ioctls. There are two ways to skin this cat, you can either download a development kernel (v2.3.x), or patch a stable release kernel (v2.2.x), the patches are at http://www.kernel.dk/, and the kernel can be found on your favorite mirror of ftp://ftp.kernel.org/.
Next, you need to get the LiViD utilities. This can be done two ways:
The following commands will retrieve them: # mkdir ~/livid # cd ~/livid # export CVSROOT=:pserver:anonymous@cvs.linuxvideo.org:/cvs/livid # cvs login (Logging in to anonymous@cvs.linuxvideo.org) CVS password: There is no password for anonymous, just press enter. # cvs -z3 co -P ac3dec oms mpeg2dec mgadvd They should download into their respective directories.
It can be found at: http://linuxvideo.org/developer/data/livid.tar.gz
If you have a development kernel (2.3.x), you should already have DVD ioctl support, so you just need to make sure you have MTRR support enabled in the kernel configuration, and then compile and install it as you normally would.
If you want to patch your exisiting kernel, start by going to
http://www.kernel.dk/and downloading the correct patch for your kernel.
If don't know how to install or patch your kernel, you should go read the Kernel HOWTO at:
http://howto.tucows.com/LDP/HOWTO/Kernel-HOWTO.html
To install the LiViD utilities, you need to make sure you have /usr/local/lib somewhere in /etc/ld.so.conf.
The following commands should compile and install the LiViD utilities on your system. If you have problems, please see the "Problems" section.
ac3dec: # cd ~/livid/ac3dec # ./autogen.sh # make # make install mpeg2dec: # cd ~/livid/mpeg2dec # ./autogen.sh # make # make install oms: # cd ~/livid/oms # ./autogen.sh # ./configure # make # make install
Now the necessary LiViD utilities should be installed. oms needs some special fifo pipes to be created for the DVD data to travel over. These can be made with the following commands (if they don't already exist):
# mkfifo /tmp/video # mkfifo /tmp/audio
One last thing to do. Oms needs /dev/dvd to be a symlink to where your DVD drive resides, such as /dev/hdb1 or /dev/scd0. If it is at /dev/cdrom, you would create the link by typing:
# ln -s /dev/cdrom /dev/dvd
It is generally a good idea not to make a symlink to a symlink, because it adds unnecessary I/O. Replace /dev/cdrom with the correct device that your dvd drive is on.
To play a DVD, you need to be running X in 16-bit color mode. With the DVD in the drive, type:
# ac3dec /tmp/audio& mpeg2dec /tmp/video& oms
If all has gone well, some text should fly by, followed by it asking you if you want it to look up the name of the disk in the DVDDB. It is safe to say yes. Then, the oms panel should pop up. Click the play button and the video window should appear and begin playing.
** Note to Matrox video card owners ** If you have matroxfb compiled into the kernel, chances are that your MTRR's are already set up. You can probably just skip this section.
Setting up your MTRR's can increase video performance quite a bit in some cases, so it is a good idea to do it. First, you need to make sure you have MTRR support in your kernel by typing:
# ls /proc/mtrr
If it tells you that there is no such thing as /proc/mtrr, you need to recompile your kernel with MTRR support (it is under "Processor type and features" in menuconfig).
Once you know MTRR is working, you need to know the base memory address of your video card, and how much video ram it has. The easiest way to do this is to look at the output of X as it starts up. Because the output usually scrolls off the screen and is lost when it switches to a different tty, you need to redirect the output of X to a file (xoutput) so you can go back and look at it to get the needed values. This can be done by typing:
# startx 2> xoutput
The line having the needed information is probably somewhere towards the middle of xoutput, and should look something like:
(--) SVGA: PCI: NVidia Riva TNT2 rev 17, Memory @ 0xee000000, 0xe2000000
Once you have located that, write down the last memory address, in this case 0xe2000000. Depending on your hardware, you may or may not have multiple memory addresses shown, so don't worry if yours looks a little different. With this information recorded, you can delete xoutput.
Next you need to create a new MTRR. In order to do that, you have know how much ram your video card has in hex. Here are some common values:
4MB -- 0x400000 8MB -- 0x800000 16MB -- 0x1000000 32MB -- 0x2000000
To add the MTRR, type:
# echo "base=0xe2000000 size=0x2000000 type=write-combining" >| /proc/mtrr
Substituting "0xe2000000" and "0x2000000" with the base address and amount of video ram specific to your system.
Now you should have MTRR set up, and just to make sure, type:
# cat /proc/mtrr
And you should get output that looks remotely similar to:
reg00: base=0x00000000 ( 0MB), size= 128MB: write-back, count=1 reg01: base=0xe2000000 (3616MB), size= 32MB: write-combining, count=1
Again, the number of entries will probably be different from these, don't sweat it.
This is a (small) list of known run-time errors.
If you use a non-Intel chip (K6 especially), and you are getting this error when you try to run mpeg2video, try editing nist/configure.in, lines 129 and 130:
CFLAGS="$CFLAGS -DHAVE_MMX -DLINUX -march=i686 -fschedule-insns2 -malign-doub CXXFLAGS="$CXXFLAGS -DHAVE_MMX -DLINUX -march=i686 -fschedule-insns2 -malign-
replace "-march=i686" in both with "-march=i586", and then recompile and reinstall.
This is a running list of common compilation errors that have known fixes.
The most frequent problem people have when trying to compile these utilities stems from oms looking in the wrong place for the kernel headers. By default, it uses /usr/include/[linux|asm], but those headers are from a stable kernel so that when you compile a normal program, it will be using stable headers. oms needs to use non-stable (or patched) kernel headers, so when oms tries to compile, many things are undeclared and compilation fails. The best way to fix this is to edit the oms Makefile and -I/usr/src/linux/include to the CFLAGS and CXXFLAGS. (thanks to Adam Powell for this info)
These commands should do it: # mkdir /usr/include/old # mv /usr/include/linux /usr/include/old/linux # mv /usr/include/asm /usr/include/old/asm # mv /usr/include/scsi /usr/include/old/scsi # ln -s /usr/src/linux/include/linux /usr/include/linux # ln -s /usr/src/linux/include/scsi /usr/include/scsi # ln -s /usr/src/linux/include/asm /usr/include/asm
Another common error is with the oms/src/plugin/codec/mpeg2dec/.libs directory. For some reason or another, this directory does not exist, and it needs to for compilation. To fix it, just make the directory:
# mkdir src/plugin/codec/mpeg2dec/.libs
Features that don't currently work as intended:
If your problem isn't listed here, then likely the current CVS code has a bug in it. The best thing to do is just to wait a few days, and then try updating from CVS. There is a mailing list where you can ask questions, to subscribe send a blank email to livid-dev-subscribe@linuxvideo.org.