LDP/LDP/howto/linuxdoc/DVD-HOWTO.sgml

499 lines
16 KiB
Plaintext

<!doctype linuxdoc system>
<article>
<title>Linux DVD HOWTO</title>
<author>http://www.linuxvideo.org/</author>
<date>v1.25, 2000-10-17</date>
<abstract>
A (hopefully) easy to follow explanation on how to get DVD movie playback
in Linux.
</abstract>
<toc>
<sect>
Introduction<label id="Introduction" >
<sect1>
Goal
<p>
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-user mailing list by sending a blank email to <url url="mailto:livid-user-subscribe@linuxvideo.org" name="livid-user-subscribe@linuxvideo.org">.
</p>
<sect1>
New Versions
<p>
This howto is available in many formats, including html and tex. The newest version can always be retrieved from <url url="http://www.linuxvideo.org/docs/Linux-DVD-HOWTO/" name="http://www.linuxvideo.org/docs/Linux-DVD-HOWTO/">. It is highly recommended that you get the most recent version, as this howto is being updated quite often.
</p>
<sect1>
Copyrights and Trademarks
<p>
This manual may be reproduced in whole or in part, without fee, subject
to the following restrictions:
</p>
<p>
<itemize>
<item> The copyright notice above and this permission notice must be preserved complete on all complete or partial copies.
<item> Any translation or derived work must be approved by the author in writing before distribution.
<item> If you distribute this work in part, instructions for obtaining the complete version of this manual must be included, and a means for obtaining a complete version provided.
<item> Small portions may be reproduced as illustrations for reviews or quotes in other works without this permission notice if proper citation is given.
</itemize>
</p>
<p>
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 <url url="ftp://ftp.gnu.org/GNU/COPYING" name="the GNU archive">.
</p>
<sect1>
Thanks
<p>
Thanks to Nathan Rowlan <url url="mailto:nkr@helo.org" name="nkr@helo.org"> for starting and maintaining this document in the early days. It has now been taken over by the LiViD support team.
</p>
<p>
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 feedback to make this HOWTO better.
</p>
<p>
Much of the layout of this HOWTO was gotten from the HOWTO-HOWTO, written by Mark F. Komarinski. It can be found at <url url="http://www.linuxdoc.org/" name="http://www.linuxdoc.org/">.
</p>
<sect1>
Translations
<p>
Translations of this document can be found at <url url="http://www.linuxvideo.org/docs/Linux-DVD-HOWTO/" name="http://www.linuxvideo.org/docs/Linux-DVD-HOWTO/">. If you would like to translate this howto, please contact the LiViD development mailing list.
</p>
<sect>
Requirements<label id="Requirements">
<p>
This HOWTO assumes you have:
<itemize>
<item> Linux kernel v2.2.x or greater. A kernel with DVD ioctls is prefered.
<item> XFree86 3.3.X or 4.x
<item> A DVD-ROM/RAM/RW drive supported in Linux (most are)
<item> A decent knowledge of bash and english
</itemize>
<p>
<sect>
Files<label id="Files" >
<p>
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 <url url="http://www.kernel.dk/" name="http://www.kernel.dk/">,
and the kernel can be found on your favorite mirror of <url url="ftp://ftp.kernel.org" name="ftp://ftp.kernel.org/">.
</p>
<p>
Next, you need to get the LiViD utilities. This can be done two ways:
</p>
<p>
<itemize>
<item> Get the LiViD utilities from CVS, so you can update it as it is being
updated by the developers. (recommended)
</itemize>
</p>
<p>
<verb>
The following commands will retrieve them (you can use -d parameter
instead of setting CVSROOT if you want):
# 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 mpeg2dec oms
They should download into their respective directories.
</verb>
</p>
<p>
<itemize>
<item>
If you don't like CVS or can't access it due to firewall issues, you
can download the most recent nightly tarball of LiViD tools at
<url url="http://www.linuxvideo.org/developer/dl.phtml" name="http://www.linuxvideo.org/developer/dl.phtml">
</itemize>
</p>
<sect>
Installation<label id="Installation">
<sect1>
Kernel
<p>
Kernels at least as recent as 2.2.16 or 2.4 series 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.
</p>
<p>
If you want to patch your exisiting older kernel, start by going to
<url url="http://www.kernel.dk/" name="http://www.kernel.dk/">
and downloading the correct patch for your kernel.
</p>
<p>
If don't know how to install or patch your kernel, you should go read
the Kernel HOWTO at
<url url="http://howto.tucows.com/LDP/HOWTO/Kernel-HOWTO.html"
name="http://howto.tucows.com/LDP/HOWTO/Kernel-HOWTO.html">
</p>
<sect1>
LiViD Utilities
<p>
To install the LiViD utilities, you need to make sure you have /usr/local/lib
somewhere in /etc/ld.so.conf.
DVD playback only requires OMS to be built. It builds ac3 and mpeg2 codecs
by itself. However, feel free to play with the standalone codecs if you
wish. The following commands should compile and install the LiViD
utilities on your system. If you have problems, please see the "Problems"
section.
</p>
<p>
<verb>
ac3dec: (optional)
# cd ~/livid/ac3dec
# ./autogen.sh
# make
# make install
mpeg2dec: (optional)
# cd ~/livid/mpeg2dec
# ./autogen.sh
# make
# make install
oms:
# cd ~/livid/oms
# ./autogen.sh
# ./configure
# make
# make install
</verb>
</p>
<p>
There are some extra options that can be used. They are placed
as arguments to the ./configure script. OMS has --enable-devel which
will enable some development and experimental features in the code.
Standard autoconf parameters such as --prefix can be used if you wish
to install somehwere other than /usr/local. For instance to install
in a subdir of the source dir you could do:
<verb>
# ./configure --prefix=`pwd`/inst
</verb>
</p>
<p>
Run ./configure --help to get a complete listing of options. If you
install X in an odd location (for instance you have XFree86 3.3.x and 4.x
installed at the same time) you may need the --x-includes and --x-libraries
options.
</p>
<p>
Now the necessary LiViD utilities should be installed. The next section is
not required, but if you use the "pipes" plugin, you will need to make some
special fifo pipes for the DVD data to travel over. These can be made with
the following commands (if they don't already exist):
</p>
<p>
<verb>
# mkfifo /tmp/video
# mkfifo /tmp/audio
</verb>
</p>
<p>
Another method of controlling the data available in the oms_devel version is to use raw I/O, which is available in the latest linux kernels. If you don't have these, data will be read from the standard device. Using raw I/O is recommended, but not necessary. If they do not exist, create two devices as follows:
<verb>
# mknod /dev/rawctl c 162 0
# mknod /dev/raw1 c 162 1
</verb>
</p>
<p>
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:
</p>
<p>
<verb>
# ln -s /dev/cdrom /dev/dvd
</verb>
</p>
<p>
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.
</p>
<sect>
Playing<label id="Playing">
<p>
First you need a config file. Copy doc/config.sample from oms source directory to .oms/config in your home directory. Edit the values to reflect the drivers, skin, device, etc you want to use.
</p>
<p>
Expect lots of text to scroll by. This is still development code. If you see lots of text, but no video window you may have a mistake in your config file. Check to make sure you are using the right plugins and devices.
</p>
<p>
To play a DVD, you need to be running X in 16-bit color mode. With the
DVD in the drive, type:
</p>
<p>
<verb>
# oms
</verb>
<p>
There is a pipe method available in older OMS versions that uses the
fifo's created earlier. Most people can ignore this. To use pipes
type:
<verb>
# ac3dec /tmp/audio& mpeg2dec /tmp/video& oms
</verb>
</p>
<p>
ac3dec and mpeg2dec may need to be killed by hand using this method.
</p>
<p>
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
playlist button, then the scan dvd button, then play.
</p>
<sect>
Additional Stuff<label id="Additional Stuff">
<sect1>
Setting up MTRR's
<p>
<verb>
** 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.
</verb>
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:
<verb>
# ls /proc/mtrr
</verb>
</p>
<p>
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).
</p>
<p>
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:
</p>
<p>
<verb>
# startx 2> xoutput
</verb>
</p>
<p>
The line having the needed information is probably somewhere
towards the middle of xoutput, and should look something like:
</p>
<p>
<verb>
(--) SVGA: PCI: NVidia Riva TNT2 rev 17, Memory @ 0xee000000, 0xe2000000
</verb>
</p>
<p>
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.
</p>
<p>
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:
</p>
<p>
<verb>
4MB -- 0x400000
8MB -- 0x800000
16MB -- 0x1000000
32MB -- 0x2000000
</verb>
</p>
<p>
To add the MTRR, type:
</p>
<p>
<verb>
# echo "base=0xe2000000 size=0x2000000 type=write-combining" >| /proc/mtrr
</verb>
</p>
<p>
Substituting "0xe2000000" and "0x2000000" with the base address and amount
of video ram specific to your system.
</p>
<p>
Now you should have MTRR set up, and just to make sure, type:
</p>
<p>
<verb>
# cat /proc/mtrr
</verb>
</p>
<p>
And you should get output that looks remotely similar to:
</p>
<p>
<verb>
reg00: base=0x00000000 ( 0MB), size= 128MB: write-back, count=1
reg01: base=0xe2000000 (3616MB), size= 32MB: write-combining, count=1
</verb>
</p>
<p>
Again, the number of entries will probably be different from these,
don't sweat it.
</p>
<sect>
Problems<label id="Problems">
<sect1>
Run time errors<label id="Run time erors">
<p>
This is a (small) list of known run-time errors.
</p>
<sect2>
Illegal Instruction Error
<p>
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:
</p>
<p>
<verb>
CFLAGS="$CFLAGS -DHAVE_MMX -DLINUX -march=i686 -fschedule-insns2 -malign-doub
CXXFLAGS="$CXXFLAGS -DHAVE_MMX -DLINUX -march=i686 -fschedule-insns2 -malign-
</verb>
</p>
<p>
replace "-march=i686" in both with "-march=i586", and then recompile
and reinstall.
</p>
<sect1>
Compilation errors<label id="Compilation errors">
<p>
This is a running list of common compilation errors that have known
fixes.
</p>
<sect2>
`dvd_struct' undeclared...
<p>
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 older headers. OMS needs to use headers with dvd ioctl support. If things are set up wrong many things are undeclared and compilation fails. The best way to fix this is to use the configure option --with-kernel-headers=(path to headers). Another way is to adjust which headers are in the default location.
</p>
<p>
<verb>
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
</verb>
</p>
<sect2>
Can't determine absolute dir of '../../../../src/plugin/codec/mpeg2dec/.libs'
<p>
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:
</p>
<p>
<verb>
# mkdir src/plugin/codec/mpeg2dec/.libs
</verb>
</p>
<sect2>
Can't find libXv.so or libXxf86dga.so
<p>
Xfree86 4.x doesn't build shared libs for Xv and Xxf86dga. However, the
shared lib setup OMS uses needs them. Build them as follows in your
favorite lib dir:
</p>
<p>
<verb>
# ld --whole-archive -shared -o libXv.so libXv.a
# ld --whole-archive -shared -o libXxf86dga.so libXxf86dga.a
</verb>
</p>
<sect2>
Failure via segfault for no apparent reason
<p>
Sometime you have old libraries laying around that are used by mistake.
This will cause unwanted behavior such as crashing. Get rid of old
libraries from /usr/local/lib or wherever you put them and things
should work.
</p>
<sect1>
Broken stuff<label id="Broken stuff">
<p>
Features that don't currently work as intended:
<itemize>
<item> The chapter seek buttons may fail.
<item> The play/pause/stop buttons may fail to work.
<item> Audio/video may skip or sound "choppy". This is due to proper syncronization and framedropping not being implemented yet.
</itemize>
</p>
<sect1>
Other errors<label id="Other errors">
<p>
If your problem isn't listed here, then likely the current CVS
code has a bug in it or is missing a feature. You can either
hope it will be fixed and update CVS every so often or subscribe
to the mailing lists and report the bug or request a feature.
To subscribe send a blank email to
<url url="mailto:livid-user-subscribe@linuxvideo.org" name="livid-user-subscribe@linuxvideo.org">.
</p>
<sect>
To Do<label id="To Do">
<p>
<itemize>
<item> Makefile options (HAVE_MMX, HAVE_3DNOW, etc)
<item> proper architecture detection (compile time and runtime)
<item> add easy MTRR stuff (framebuffer)
<item> add need for region coding to be set on most drives: www.linuxtv.org/dvd
</itemize>
</p>
</article>