Commit 8af2f325 authored by Nico Sabbi's avatar Nico Sabbi

first split of dvdread; it's just a copy of dvdnav still to be cleaned

Daniel Caujolle-Bert <>
Thomas Vander Stichele <>
Rich Wareham <>
Kees Cook <>
Michael Roitzsch <>
Frantisek Dvorak <>
This diff is collapsed.
libdvdnav /4.1.3)
* an embarassing amount of fixes regarding potential memory and resource leaks
(patches contributed by Erik Hovland)
* added dvdread-config (dvdnav-config's younger brother)
libdvdnav (4.1.2)
* multiple build system fixes
* added dvdnav_describe_title_chapters(title) to get title and chapters
libdvdnav (4.1.1)
* added dvdnav_audio_stream_channels() to return number of channels
* fixed dvdnav_time_search() in multi-angle dvds (but it still needs
* added dvdnav_audio_stream_format() to identify the codec used
in audio streams
* starting DVD playback at specific title/part positions with
dvdnav_{title,part}_play() works again
* removed wrong SPU stream change event filter
(fixes unwanted subtitles in the trailer of "Girl, interrupted", RC2)
* fixed error "Expected NAV packet but none found." occuring sometimes
on resume from menu
libdvdnav (0.1.10)
* filter the symbols that we export.
* fix LinkNextC assertion failure (fixes LotR-SEE bonus disc image gallery)
* detect zero stilltime still cells inside PGCs, not only at the end
(fixes "Red Dragon" RC2 scene selection)
* PGC stills seem to work, assertion removed
* fix rare race condition after Exit commands
* fix wrong JumpSS_VTSM execution in German RC2 "Anatomie"
(fix ported from Ogle)
libdvdnav (0.1.9)
* libdvdnav does not depend on libdvdread any more. It has it's own version.
* fix some situations where an unlucky user could trigger assertions
libdvdnav (0.1.8)
* more timing info in cell change event struct
* documentation review
libdvdnav (0.1.7)
* fixed a bug in title jumping, where the title number would not be
converted from TTN to VTS_TTN properly
* some minor sanity checks added to prevent segfaults
libdvdnav (0.1.6) unstable; urgency=low
* new event DVDNAV_WAIT to fix consistency problems in applications with fifos
where libdvdnav is always a bit ahead in the stream, the event forces
the application to wait for its fifos to get empty
* correct HIGHLIGHT reporting when a button is activated
* method to try-run VM operations, now used for safer chapter skipping and menu jumps
* fixed detection of current PTT to not assume a 1:1 mapping between PTTs and PGs
* releasing stills when jumping to menu fixes some state inconsistencies
* do not assume PGs to be physically layed out in sequence on the disc
* optional PGC based seeking
* new event on cell changes for timing info
libdvdnav (0.1.5) unstable; urgency=low
* some bugfixes
* code cleanup
* build process polishing
* more sensible event order in get_next_block to ensure useful event delivery
* VOBU level resume
* fixed: seeking in a multiangle feature briefly showed the wrong angle
libdvdnav (0.1.4) unstable; urgency=low
* more read cache improvements
* minor fixes for some problematic DVDs
libdvdnav (0.1.3-1) unstable; urgency=low
* Zero-copy read cache.
* More support for alternative Menu languages.
-- Rich Wareham <> Fri, 2 Aug 2002 08:52:24 +0100
libdvdnav (0.1.2-1) unstable; urgency=low
* Read Cache changes. Recommended setting for read_cache is OFF.
Unless one's DVD drive has too small a buffer.
* Should work with xine 0.9.10 or above.
-- James Courtier-Dutton <> Sun, 3 Jul 2002 15:30:00 +0000
libdvdnav (0.1.1-1) unstable; urgency=low
* New upstream version. (closes: #148495)
* Include TODO
* Fix config.h problem
* Threaded cache
-- Philipp Matthias Hahn <> Sat, 1 Jun 2002 17:47:59 +0200
libdvdnav (0.1.0-2) unstable; urgency=low
* Add manual page dvdnav-config.1
* Add bug-presubj on Daniel's request
* Get dvdnav.c:1.17 from CVS to fix angle support
* Merge patch from Jamie Wilkinson (#146699)
* Rerun automake to fix dependencies
* Ack NMU from siggi
* Fix include in examples/menus.c
-- Philipp Hahn <> Thu, 23 May 2002 09:41:15 +0200
libdvdnav (0.1.0-1.1) unstable; urgency=low
* Prepared for first 'real' release.
* Bug fixes
* Changes to allow apps to 'roll-their-own' dvdnav_get_next_block functions.
* NMU in order to get xine-dvdnav running again
- changed package name to libdvdnav0
(see patch from Jamie Wilkinson for a better solution)
-- Siggi Langauf <> Mon, 20 May 2002 15:57:40 +0200
libdvdnav (0.0.1-1) unstable; urgency=low
* Repackaged using dh-make.
-- Philipp Matthias Hahn <> Sun, 7 Apr 2002 16:29:35 +0200
libdvdnav (0.0.1) unstable; urgency=low
* Initial release.
* Split from xine-dvdnav
-- rjw57 <> Tue, 12 Mar 2002 19:41:13 +0000
This fork of dvdnav was created to overcome the lack of responsiveness
of the official development channel, not to bastardize this library in
something for specific usage by mplayer, so these are the rules to follow
when developing code:
- don't remove pre-existing code that mplayer doesn't need
- don't add code to expose the internals of dvdnav
- don't add code that binds applications to side-effects of the library
- don't alter the API in an incompatible manner
When committing code to the repository always follow these rules:
- don't break the compilability of the library - always keep svn checkouts usable
- never mix cosmetical and functional changes
- don't commit unrelated changes as a single transaction
- don't split strictly related changes over multiple commits
- never alter the indentation / bracing / prototyping style of existing files
- if you break something by accident fix it as soon as possible using the appropriate
svn tools to revert your commit(s). If in doubt ask explanations to the
mailing list
- trivial patches such as spell fixes, prototype mismatch, missing includes,
more proper variable typization and similar should be committed without asking
prior authorization
If in reiterated violation of these rules your account will be deleted.
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
Foundation, Inc.
This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
Basic Installation
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. (Caching is
disabled by default to prevent problems with accidental use of stale
cache files.)
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `' (or `') is used to create
`configure' by a program called `autoconf'. You only need
`' if you want to change it or regenerate `configure' using
a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. Run `./configure --help'
for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not support the `VPATH'
variable, you have to compile the package for one architecture at a
time in the source code directory. After you have installed the
package for one architecture, use `make distclean' before reconfiguring
for another architecture.
Installation Names
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
There may be some features `configure' cannot figure out
automatically, but needs to determine by the type of machine the package
will run on. Usually, assuming the package is built to be run on the
_same_ architectures, `configure' can figure that out, but if it prints
a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
where SYSTEM can have one of these forms:
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the `--target=TYPE' option to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/' if it exists, then
`PREFIX/etc/' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
will cause the specified gcc to be used as the C compiler (unless it is
overridden in the site shell script).
`configure' Invocation
`configure' recognizes the following options to control how it
Print a summary of the options to `configure', and exit.
Print the version of Autoconf used to generate the `configure'
script, and exit.
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
Alias for `--cache-file=config.cache'.
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.
# libdvdnav Makefile
include config.mak
SRCS = dvdnav.c highlight.c navigation.c read_cache.c remap.c searching.c settings.c
SRCS+= decoder.c vm.c vmcmd.c
HEADERS = src/dvd_types.h src/dvdnav.h src/dvdnav_events.h
CFLAGS += $(USEDEBUG) -Wall -funsigned-char
CFLAGS += -I$(CURDIR) -I$(SRC_PATH)/src -I$(SRC_PATH)/src/vm
ifeq ($(DVDREAD),internal)
VPATH+= $(SRC_PATH_BARE)/src/libdvdread
DVDREAD_HEADERS = src/libdvdread/dvd_reader.h \
src/libdvdread/ifo_print.h \
src/libdvdread/ifo_read.h \
src/libdvdread/ifo_types.h \
src/libdvdread/nav_print.h \
src/libdvdread/nav_read.h \
src/libdvdread/dvd_udf.h \
src/libdvdread/nav_types.h \
DVDREAD_SRCS = dvd_input.c dvd_reader.c dvd_udf.c ifo_print.c ifo_read.c \
md5.c nav_print.c nav_read.c bitreader.c
CFLAGS += -I$(SRC_PATH)/src/libdvdread
LIB = $(L).a
SHLIB = $(L).so
.OBJDIR= obj
OBJS = $(patsubst %.c,%.o, $(SRCS))
DVDREAD_OBJS = $(patsubst %.c,%.o, $(DVDREAD_SRCS))
SHOBJS = $(patsubst %.c,, $(SRCS))
DVDREAD_SHOBJS = $(patsubst %.c,, $(DVDREAD_SRCS))
DEPS= ${OBJS:%.o=%.d}
BUILDDEPS = Makefile config.mak
ifeq ($(BUILD_SHARED),yes)
all: $(SHLIB) $(MINI_SHLIB) $(DVDREAD_SHLIB) dvdnav-config dvdread-config
install: $(SHLIB) $(DVDREAD_SHLIB) install-shared install-dvdnav-config install-dvdread-config
ifeq ($(BUILD_STATIC),yes)
all: $(LIB) $(DVDREAD_LIB) dvdnav-config dvdread-config
install: $(LIB) $(DVDREAD_LIB) install-static install-dvdnav-config install-dvdread-config
install: install-headers
# Let create version.h
SVN_ENTRIES = $(SRC_PATH_BARE)/.svn/entries
ifeq ($(wildcard $(SVN_ENTRIES)),$(SVN_ENTRIES))
version.h: $(SVN_ENTRIES)
$(SRCS) $(DVDREAD_SRCS): version.h
# General targets
mkdir $(.OBJDIR)
${LIB}: version.h $(.OBJDIR) $(OBJS) $(BUILDDEPS)
cd $(.OBJDIR) && $(AR) rc $@ $(OBJS)
cd $(.OBJDIR) && $(RANLIB) $@
ifeq ($(DVDREAD),internal)
cd $(.OBJDIR) && $(AR) rc $@ $(DVDREAD_OBJS)
cd $(.OBJDIR) && $(RANLIB) $@
ifeq ($(DVDREAD),internal)
cd $(.OBJDIR) && $(CC) $(SHLDFLAGS) -L. -Wl,-soname=$(SHLIB).$(SHLIB_MAJOR) -o $@ $(SHOBJS) -ldvdread $(THREADLIB)
${SHLIB}: version.h $(.OBJDIR) $(SHOBJS) $(BUILDDEPS)
cd $(.OBJDIR) && $(CC) $(SHLDFLAGS) -Wl,-soname=$(SHLIB).$(SHLIB_MAJOR) -o $@ $(SHOBJS) -ldvdread $(THREADLIB)
cd $(.OBJDIR) && $(CC) $(SHLDFLAGS) -Wl,-soname=$(MINI_SHLIB).$(SHLIB_MAJOR) -o $@ $(SHOBJS) $(THREADLIB)
ifeq ($(DVDREAD),internal)
cd $(.OBJDIR) && $(CC) $(SHLDFLAGS) -ldl -Wl,-soname=$(DVDREAD_SHLIB).$(SHLIB_MAJOR) -o $@ $(DVDREAD_SHOBJS)
endif $(BUILDDEPS)
cd $(.OBJDIR) && $(CC) -fPIC -DPIC -MD $(CFLAGS) -c -o $@ $<
.c.o: $(BUILDDEPS)
cd $(.OBJDIR) && $(CC) -MD $(CFLAGS) -c -o $@ $<
# Install targets
install -d $(DESTDIR)$(incdir)
install -m 644 $(HEADERS) $(DESTDIR)$(incdir)
ifeq ($(DVDREAD),internal)
install -d $(DESTDIR)$(dvdread_incdir)
install -m 644 $(DVDREAD_HEADERS) $(DESTDIR)$(dvdread_incdir)
install-shared: $(SHLIB)
install -d $(DESTDIR)$(shlibdir)
install $(INSTALLSTRIP) -m 755 $(.OBJDIR)/$(SHLIB) \
install $(INSTALLSTRIP) -m 755 $(.OBJDIR)/$(MINI_SHLIB) \
cd $(DESTDIR)$(shlibdir) && \
cd $(DESTDIR)$(shlibdir) && \
cd $(DESTDIR)$(shlibdir) && \
cd $(DESTDIR)$(shlibdir) && \
ifeq ($(DVDREAD),internal)
install $(INSTALLSTRIP) -m 755 $(.OBJDIR)/$(DVDREAD_SHLIB) \
cd $(DESTDIR)$(shlibdir) && \
cd $(DESTDIR)$(shlibdir) && \
install-static: $(LIB)
install -d $(DESTDIR)$(libdir)
install $(INSTALLSTRIP) -m 755 $(.OBJDIR)/$(LIB) $(DESTDIR)$(libdir)/$(LIB)
ifeq ($(DVDREAD),internal)
install $(INSTALLSTRIP) -m 755 $(.OBJDIR)/$(DVDREAD_LIB) $(DESTDIR)$(libdir)/$(DVDREAD_LIB)
# Clean targets
rm -rf *~ $(.OBJDIR) version.h
distclean: clean
find . -name "*~" | xargs rm -rf
rm -rf config.mak
dvdnav-config: $(.OBJDIR)
@echo '#!/bin/sh' > $(.OBJDIR)/dvdnav-config
@echo 'prefix='$(PREFIX) >> $(.OBJDIR)/dvdnav-config
@echo 'libdir='$(shlibdir) >> $(.OBJDIR)/dvdnav-config
@echo 'version='$(SHLIB_VERSION) >> $(.OBJDIR)/dvdnav-config
@echo 'dvdread='$(DVDREAD) >> $(.OBJDIR)/dvdnav-config
@echo 'dvdreaddir='$(DVDREAD_DIR) >> $(.OBJDIR)/dvdnav-config
@echo 'threadlib='$(THREADLIB) >> $(.OBJDIR)/dvdnav-config
@echo >> $(.OBJDIR)/dvdnav-config
cat $(SRC_PATH_BARE)/misc/ >> $(.OBJDIR)/dvdnav-config
chmod 0755 $(.OBJDIR)/dvdnav-config
install-dvdnav-config: dvdnav-config
install -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 $(.OBJDIR)/dvdnav-config $(DESTDIR)$(PREFIX)/bin/dvdnav-config
dvdread-config: $(.OBJDIR)
@echo '#!/bin/sh' > $(.OBJDIR)/dvdread-config
@echo 'prefix='$(PREFIX) >> $(.OBJDIR)/dvdread-config
@echo 'libdir='$(shlibdir) >> $(.OBJDIR)/dvdread-config
@echo 'version='$(SHLIB_VERSION) >> $(.OBJDIR)/dvdread-config
@echo >> $(.OBJDIR)/dvdread-config
cat $(SRC_PATH_BARE)/misc/ >> $(.OBJDIR)/dvdread-config
chmod 0755 $(.OBJDIR)/dvdread-config
install-dvdread-config: dvdread-config
install -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 $(.OBJDIR)/dvdread-config $(DESTDIR)$(PREFIX)/bin/dvdread-config
vpath ${.OBJDIR}
vpath %.o ${.OBJDIR}
vpath ${LIB} ${.OBJDIR}
# include dependency files if they exist
$(addprefix ${.OBJDIR}/, ${DEPS}): ;
-include $(addprefix ${.OBJDIR}/, ${DEPS})
include $(top_srcdir)/misc/Makefile.common
SUBDIRS = src examples doc misc m4
ChangeLog \
configure \
config.guess \
config.sub \
install-sh \
libtool \ \
missing \
mkinstalldirs \
$(distdir).tar.gz $(PACKAGE).tgz package_descriptions
MAINTAINERCLEANFILES += configure $(ACLOCAL_M4) \ config.guess config.sub install-sh missing \
mkinstalldirs $(DEPCOMP)
@$(MAKE) clean all install 2> warnings.log
test -s warnings.log || rm warnings.log
-rm -f config.cache
@./config.status misc/
@./ noconfig && $(SHELL) misc/
cp -r $(srcdir)/msvc $(distdir)/msvc
rm -rf `find $(distdir)/msvc -name CVS`
This file is unused.
The ChangeLog file lists changes for new versions.
What is this all about?
libdvdnav is a library that allows easy use of sophisticated DVD navigation
features such as DVD menus, multiangle playback and even interactive DVD games.
All this functionality is provided through a simple API which provides the
DVD playback as a single logical stream of blocks, intermitted by special
dvdnav events to report certain conditions. The main usage of libdvdnav is a
loop regularly calling a function to get the next block, surrounded by
additional calls to tell the library of user interaction.
The whole DVD virtual machine and internal playback states are completely
Where does it come from?
This library is based on a lot of code and expertise from the Ogle project.
Ogle was the first DVD player who implemented free DVD navigation. The
libdvdnav developers wish to express their gratitude to the Ogle people
for all the valuable research work they have done.
Initially, the dvdnav code was part of a plugin to the xine media player
called xine-dvdnav. Later on, the DVD VM specific code was split
from xine-dvdnav and went into the first version of libdvdnav.
Where is it now?
libdvdnav is hosted on .
Please report bugs to the developers mailinglist at .
We are still in beta stage, but libdvdnav is already quite usable. With
regular DVD playback, there should not be any serious issues. The library
also makes some limited effort to handle error situations gracefully, but
there are still assertions in the code that may trigger on some DVDs. Please
send a report to the developer mailinglist, if you encounter such problems.
How can I use it?
libdvdnav is completely licensed under GPL. You may use it at wish within the
bounds of this license. See the file "COPYING" for a copy of the GPL.
Sources for documentation on libdvdnav are:
* the examples directory contains a simple program using libdvdnav
this one is well-commented and therefore a good starting point
* the public header dvdnav.h documents the API
* the public header dvdnav_events.h documents the dvdnav events
* doc/library_layout contains some info on the internal working of libdvdnav
Sources for documentation on DVD terminology, structure and surrounding concepts:
* doc/dvd_structures briefly explains DVD terms and organization
* a more detailed description of DVD structures is available at
* the ifo_types.h and nav_types.h headers are also interesting if you
are already used to the sometimes cryptical abbreviations
* Support DVDs with errors on them. So we can recover from corrupt sectors in the .VOB. Also, handle corrupt .IFO files by using the backup .BUP files.
* Support Random and Shuffle Titles. Only sequencial Titles are currently supported.
* rework documentation
* implement restriction levels:
0 - execute everything as the app commands