Browse files

0.6.11 import

  • Loading branch information...
0 parents commit cc97fc26565f1338cad04f0c57899e18e5fb32ff Unknown committed May 30, 2006
Showing with 19,701 additions and 0 deletions.
  1. +2 −0 AUTHORS
  2. +340 −0 COPYING
  3. +270 −0 ChangeLog
  4. +9 −0 INSTALL
  5. +17 −0 Makefile.am
  6. 0 NEWS
  7. +80 −0 README
  8. +41 −0 TODO
  9. +91 −0 configure.ac
  10. +17 −0 doc/Makefile.am
  11. +538 −0 doc/dvdauthor.sgml
  12. +198 −0 doc/dvdauthor.xsd
  13. +189 −0 doc/examples.sgml
  14. +41 −0 doc/html.dsl
  15. +485 −0 doc/iso639.sgml
  16. +14 −0 doc/root.sgml
  17. +241 −0 doc/spumux.sgml
  18. +96 −0 doc/spumux.xsd
  19. +62 −0 dvdauthor.spec.in
  20. +56 −0 src/Makefile.am
  21. +28 −0 src/compat.c
  22. +108 −0 src/compat.h
  23. +69 −0 src/conffile.c
  24. +1 −0 src/conffile.h
  25. +204 −0 src/da-internal.h
  26. +1,161 −0 src/dvdauthor.c
  27. +74 −0 src/dvdauthor.h
  28. +1,038 −0 src/dvdcli.c
  29. +933 −0 src/dvdcompile.c
  30. +41 −0 src/dvddirdel.in
  31. +588 −0 src/dvdifo.c
  32. +407 −0 src/dvdpgc.c
  33. +546 −0 src/dvdunauthor.c
  34. +106 −0 src/dvdvm.h
  35. +137 −0 src/dvdvml.l
  36. +377 −0 src/dvdvmy.y
  37. +1,718 −0 src/dvdvob.c
  38. +727 −0 src/mpeg2desc.c
  39. +246 −0 src/readxml.c
  40. +21 −0 src/readxml.h
  41. +36 −0 src/rgb.h
  42. +1,133 −0 src/spuunmux.c
  43. +2 −0 src/subconfig.h
  44. +1,137 −0 src/subfont.c
  45. +91 −0 src/subfont.h
  46. +659 −0 src/subgen-encode.c
  47. +912 −0 src/subgen-image.c
  48. +368 −0 src/subgen-parse-xml.c
  49. +928 −0 src/subgen.c
  50. +92 −0 src/subgen.h
  51. +57 −0 src/subglobals.h
  52. +2,199 −0 src/subreader.c
  53. +43 −0 src/subreader.h
  54. +671 −0 src/subrender.c
  55. +56 −0 src/subrender.h
Sorry, we could not display the entire diff because it was too big.
2 AUTHORS
@@ -0,0 +1,2 @@
+Scott Smith <trckjunky@users.sourceforge.net>
+
340 COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
270 ChangeLog
@@ -0,0 +1,270 @@
+0.6.11: February 10, 2005
+ fix compile error on newer gcc compilers
+ ensure a row of a subtitle takes less than 1440 bits
+ fix warnings
+ fix 64-bit support (iconv)
+ fix video and sector pts values to be more consistant
+ fix ImageMagick 6.x.x alpha detection
+ improved dvdunauthor by Ralf Engels
+ full sized pts/scr support (for 13+ hours DVD's)
+ support really long subtitles
+ fix jumps from FPC to VMGM menus (was using LinkPGCN, now uses JumpSS -- fixes crash in Ogle and Pioneer 343
+ fix ability to have multiple entries for a PGC
+ fix bug when decoding some subtitles
+ switch to automake
+ have mpeg2desc parse mpeg1 headers (thanks to Nico Sabbi)
+ fix handling of NTSC 3:2 pulldown (end PTS was != start PTS of next VOBU)
+
+0.6.10: March 15, 2004
+ better audio type detection logic
+ clear seamless flag on audio discontinuity
+ only allow <titles> to exist once per titleset
+ use 'name' attribute for buttons and actions in spumux (to be consistant with dvdauthor)
+ dynamically allocate PGC buffer
+ allow up to 2730 titles
+ allow reading from filedescriptors for VOBs, palette, and XML
+ allow empty pre, post, cell, etc commands (parses to NOP)
+ optimize link & button=X instructions together
+ fix parsing of textsub->transparent
+ add text subtitle documentation
+ fix SVCD subtitling
+ support specifying resume cells from calls; default to #1 for post commands
+ make spuunmux use read instead of lseek (works on pipes)
+ fix YUV handling in spuunmux and subgen
+ handle 99 titlesets in dvdunauthor
+ support nonexistant audio channels
+ lazy colormap allocation
+ support VOBU's without audio or video
+
+0.6.9: January 16, 2004
+ cap maximum # of tmapt entries to 2040
+ convert filenames from UTF8 to locale
+ strip out END marker from program stream (clean up mplex output)
+ allow more than 512 chapters/titles
+ fix handling of programs (not chapters)
+ make VMGM IFO scanner deal with lowercase filenames
+ fix handling of text subtitles that use frame #'s as timecodes
+ fix bug in mpeg audio header scanning
+ languages must be in lowercase
+ better audio gap setting
+ fix PAL/NTSC issue
+ rename dvddirgen to dvddirdel to better reflect purpose
+ better support for nonstandard frame rates
+ don't set seamless flag for cells with commands or stilltime
+ bounds check #cells/vob, programs/pgc
+
+0.6.8: December 14, 2003
+ allow xoffset and yoffset in spu tags
+ support multiple menu languages
+ support mpeg-1 video
+ support incorrect frame rates
+ fix/allow open GOP's on cell boundaries if sequential playback
+ fix bug in analyzing video codes (spurious sequence end codes)
+ add proper scanning of ac3 and pcm audio stream details
+ add support for NTSC closed captioning
+ support 96khz audio
+ support holes in video (aka audio cd's)
+ make subtitle placement dependent on pack dts, not video pts
+ add spuunmux; properly handle menu button colors
+ include XML schemas for XML verification
+
+0.6.7: November 24, 2003
+ autodetect io.h presense for Cygwin
+ have spumux deal with incomplete reads/writes to/from pipes
+ have spumux work with odd sized subtitles
+ allow XML comments in dvd code
+ support else for if statements
+ add 'not' boolean expr
+ add support for cells and programs
+ add mini optimizer
+ fix subtitle ptr logic in VOBU packets (perfectly matches Grosse Pointe Blank)
+ make ff/rew ptr handling more like commercial dvds
+ fix corner case in reference frame end calculation
+
+0.6.6: November 13, 2003
+ fix makefile for case insensitive filesystem (adds .PHONY rule)
+ allow jumps to menu entries from VMGM without jumppad
+ fix bug where jumppads were not generated in a VMGM if no VMGM menus existed
+ allow forced subtitles -- now all menus REQUIRE 'force="1"' option
+ base chapters on PTS not SCR
+ allow expressions
+
+0.6.5: November 6, 2003
+ workaround for libxml2 2.5.4 -- manually check for whitespace in TEXT elements
+ fix xml parser when chapters are not specified
+ support <video widescreen="nopanscan|noletterbox" />
+ have jumps to other titles within the same titleset use JumpVTS_TT, not LinkPGCN
+ add some error checking on title/chapter jumping
+ fix bug when stuffing subtitles
+
+0.6.4: November 1, 2003
+ fix bug in if statement -- it was doing the opposite
+ set O_BINARY for stdin, stdout in spumux
+ allow pgcs without any sources
+
+0.6.3: October 30, 2003
+ fix bug in setting audio, subtitle, angle, button values
+ more documentation
+
+0.6.2: October 27, 2003
+ fix segfault when parsing certain xml files
+ add HTML documentation
+
+0.6.1: October 26, 2003
+ fix incorrect command length field for menu entries
+ move menu entry pgcs to the end of the list to make numbering simpler
+ allow jumping/calling to a wider variety of targets
+ fix bug in autonavigation
+ fix segfault if button is not defined in spumux
+ fix stilltime for vobs
+ add stilltime for pgc
+ reduce libxml2 requirement to 2.5.0
+
+0.6.0: October 21, 2003
+ rename submux to spumux
+ set default button to #1 when entering a menu
+ add support for autoaction buttons
+ pass button navigation and color information from spumux to dvdauthor
+ support (optional) ImageMagick (or GraphicsMagick) libraries
+ create new programming language for buttons, pre, post, and fpc cmds
+ use XML configuration files for dvdauthor and spumux
+
+0.5.4: October 4, 2003
+ vobu pointers only point within a cell -- fixes chapter playback for some players (thanks to <selva at mailaps dot org>)
+ fix uninitialized variable hasseqend (thanks to <selva at mailaps dot org>)
+ read button color index information from palette file (thanks to <selva at mailaps dot org>)
+ fix handling of vobus without video (thanks to <selva at mailaps dot org>)
+ fix handling of audio sectors that are outside the pts range of the vobu (thanks to <selva at mailaps dot org>)
+ compute pts based on frame counts (handles 3:2 correctly)
+ fix incorrect NTSC fps (29.97 instead of 29.97002997.....)
+ fix discontinuity flag on TMAP -- should be on all chapters, not just vob boundaries, also should be set for future discontinuity, not past
+ compute audio gap (for AC3 and MP2 only...)
+ fix handling of field encoded video
+ allow post commands on menus
+ fix subtitles that have packets within 6 bytes of a sector (thanks to <panteltje>)
+ allow specification of button movement (thanks to Mark Rages)
+
+0.5.3: May 3, 2003
+ tighten mpeg boundary gap
+ add discontinuity flag to TMAPT table
+ clean up Makefile.in based on FreeBSD port (thanks to <pb at freebsd dot org>)
+ add exit and fpc commands
+ allow specification of 'post' commands
+ allow specification of which menu is the entry menu for title, root, audio, subtitle, angle, and ptt
+ allow setting of subtitle track as a command
+ set palette per PGC
+ allow palette to be RGB if the filename ends in .rgb (case insensitive)
+ rewrite the aspect ratio in the sequence header
+ add 'make uninstall'
+
+0.5.2: April 30, 2003
+ fix STC discontinuity and VOB/cell idn assignment bugs
+ fix multiple titles within a titleset
+ allow - for stdin
+ allow multiple commands per button
+ allow setting of audio track
+
+0.5.1: March 19, 2003
+ WARNING -- THIS RELEASE IS UNTESTED
+ multiple titles within a titleset
+ added submux (from Jan Panteltje <panteltje at yahoo dot com>)
+ multiple menus for deeper navigation
+ fix bug in detecting mp2 tracks
+
+0.5.0: February 25, 2003
+ basic menu support
+ don't allow both nopanscan and noletterbox, unless you're 4x3 -- then enforce both
+ vobu_se_e_ptm now written when sequence_end_code found
+ fix bug that doesn't write out of bounds ff/rew data correctly
+ fix pts computation bug for last vobu
+ fix bug in audio and subtitle track detection
+ fix c_eltm, e_eltm (again) -- calc in 30fps not 29.97fps (wtf?)
+ fix ff so it doesn't round up
+ add RPM spec file dvdauthor.spec (thanks to Dr. Peter Bieringer <pb at bieringer dot de>)
+ infer PCM bits/channel (though cannot infer #channels)
+ sort of handle VOBU's without video (needs work)
+ tweak TMAPT table in IFO files (god I hate NTSC)
+
+0.4.3: February 19, 2003
+ don't presume no pan/scan; add options nopanscan, noletterbox
+ fix TMAPT generation bug from 0.4.2
+ reduce makedvd's function
+
+0.4.2: February 19, 2003
+ fix subtitle support
+ make mpeg2desc print substream info on private1
+ make dvddirgen work with dirs that have spaces
+ fix c_eltm, e_eltm, s_ptm, and e_ptm
+ autodetection of ac3/mp2/dts audio channels and subpicture channels
+ provide sector pointers for multiple audio and subpicture channels
+
+0.4.1: February 14, 2003
+ fix fatal bug in dvdvtsgen and dvdtocgen
+ force user to specify -r to dvddirgen to delete dirs
+ distribute files as user writable
+
+0.4.0: February 13, 2003
+ allow letterboxing
+ compile under Mac OSX
+ fix bug with AC3 playback
+ autoconf
+ largefile support
+ remove dependence on getopt_long
+ more efficient background mplex'ing (starts them sequentially instead of in parallel)
+ support multiple audio tracks (from Jan Panteltje <panteltje at yahoo dot com>)
+ support subpicture tracks (from Jan Panteltje <panteltje at yahoo dot com>)
+ make subpicture colors more readable (from Jan Panteltje <panteltje at yahoo dot com>)
+ allow specification of palette on commandline (from Jan Panteltje <panteltje at yahoo dot com>)
+ allow shell commands as vobs
+ allow working dir to be specified in a config file
+
+0.3.1: December 31, 2002
+ makevob retains proper a/v sync
+ performance improvements to ifogen -- O(n) realloc (instead of O(n^2)) and O(n lg n) vobu fixup (instead of O(n^2))
+ handle chapter mpegs that don't start at 0.00 sec
+
+0.3.0: November 16, 2002
+ fix bug in tocgen where the VTS was not being properly described
+ better status messages from ifogen
+ support multiple titlesets (thus multiple titles -- 1 per vts)
+ allow specification of audio format (but no autodetect)
+ fix bug in makedvd w.r.t. filenames with spaces
+
+0.2.3: November 14, 2002
+ auto detect settings from mpeg video stream:
+ frame rate (thus ntsc vs pal; only 29.97 and 25 suported)
+ resolution
+ aspect ratio
+ make said settings overridable on the command line
+ update README
+ fix bug that could cause ifogen to miss 0-10% of the picture frames thus causing poor ff/rew
+
+0.2.2: November 12, 2002
+ no more qsort! (finally!)
+ make makedvd more compatible (no more ++, workaround for no mktemp)
+ fix makevob (mpeg2desc is very fifo-savvy now)
+ fix # chapter in VIDEO_TS.IFO (for Ogle, Mplayer, and some settop DVD players)
+
+0.2.1: November 11, 2002
+ fix segfault on file not found
+ allow spaces in mpg filenames
+ fix bug in handling mpegs with much longer audio tracks than video tracks
+ fix vobu_e_pts values (fixes playback on Pioneer DV343)
+
+0.2.0: September 22, 2002
+ work with clips > 1 gig
+ support multiple chapters
+
+0.1.2: July 31, 2002
+ fix ff/rew
+
+0.1.1: July 31, 2002
+ allow variable size GOP's
+ work with clips > 4 minutes
+ nicer logging
+
+0.1.0: July 30, 2002
+ Initial release. Can write roughly a 4 minute video clip to a dvd
+ and it will play! limitations include 511 GOP's, 15 frames per
+ GOP, 29.97 fps, 720x480, 48kHz audio encoded with mpeg1. But it
+ works!
9 INSTALL
@@ -0,0 +1,9 @@
+To compile, type
+ ./configure
+ make
+
+Then to install, type
+ make install
+
+If you don't want the files installed to /usr/local/bin, then you can
+specify --prefix=/usr or some other dir as a parameter to configure.
17 Makefile.am
@@ -0,0 +1,17 @@
+SUBDIRS = doc src
+
+noinst_DATA = dvdauthor.spec
+
+EXTRA_DIST = dvdauthor.spec dvdauthor.spec.in
+
+edit = sed \
+ -e 's,@sysconfdir\@,$(sysconfdir),g' \
+ -e 's,@PACKAGE_NAME\@,@PACKAGE_NAME@,g' \
+ -e 's,@PACKAGE_VERSION\@,@PACKAGE_VERSION@,g' \
+ -e 's,@PACKAGE_BUGREPORT\@,@PACKAGE_BUGREPORT@,g'
+
+dvdauthor.spec: dvdauthor.spec.in src/config.h
+ rm -f dvdauthor.spec dvdauthor.spec.tmp
+ $(edit) dvdauthor.spec.in > dvdauthor.spec.tmp
+ mv dvdauthor.spec.tmp dvdauthor.spec
+
0 NEWS
No changes.
80 README
@@ -0,0 +1,80 @@
+dvdauthor is a program that will generate a DVD movie from a valid
+mpeg2 stream that should play when you put it in a DVD player.
+
+To start you need mpeg files that contain the necessary DVD VOB
+packets. These can be generated by passing '-f 8' to mplex. See the
+included utility makevob.
+
+There are 3 steps to building the DVD directory structure on your HDD.
+
+1. Delete a previously authored dvd
+
+ dvddirdel [-o dir]
+
+ WARNING! This will delete without discrimination the contents of
+ the directory that you specify!
+
+2. Create your titlesets
+
+ dvdauthor [-o dir] [audio/video/subpicture options] [chapters]
+
+ To create 1 chapter per mpeg, simply do
+
+ dvdauthor [-o dir] [a/v/s options] chap1.mpg chap2.mpg chap3.mpg...
+
+ To manually specify chapters, use the '--chapters' option
+
+ dvdauthor [-o dir] [a/v/s options] -c chap1a.mpg chap1b.mpg -c chap2a.mpg chap2b.mpg ....
+
+ To add chapters every fifteen minutes, do
+
+ dvdauthor [-o dir] [a/v/s options] -c 0,15:00,30:00,45:00,1:00:00,1:15:00... longvideo.mpg
+
+ Call dvdauthor for each titleset you want to create. Note that
+ due to the DVD standard, all audio, video, and subpicture options
+ must be set once for the entire titleset; i.e. you cannot mix pal
+ and ntsc video in the same titleset. For that you must generate
+ separate titlesets.
+
+ Run dvdauthor -h to see the audio, video, and subpicture options.
+ Note that dvdauthor can autodetect most parameters except the
+ language.
+
+3. Create the table of contents
+
+ dvdauthor -T [-o dir]
+
+Viola! You now have a DVD directory structure that will probably
+work! You can now write this out to your DVD, mini-DVD (CD), or just
+play it from your HDD. To generate the UDF image to burn to DVD, use
+mkisofs from cdrtools-1.11a27 or later. Simply pass it the -dvd-video
+option.
+
+BTW, if you have an old HDD that you use for generating dvd images,
+you can create /usr/local/etc/dvdauthor.conf or ~/.dvdauthorrc and add
+the line:
+
+ WORKDIR=foo
+
+Then you won't need to specify -o to dvddirgen or dvdauthor.
+Alternatively, you could just set
+
+ WORKDIR=mydvd
+
+to always have it create a DVD in the current working directory.
+
+
+links:
+
+cdrtools: http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html
+ includes a version of mkisofs that can create udf images, but it's in the alpha directory
+mjpegtools: http://mjpeg.sourceforge.net
+ includes mplex for building an mpeg2 system stream with hooks
+ for DVD navigation packets
+mpucoder's site on dvd specs: http://mpucoder.dynodns.net/dvd/index.html
+ details on the DVD format
+libdvdread: http://www.dtek.chalmers.se/groups/dvd/downloads.shtml
+ includes ifo_dump for disecting DVD's. the library
+ also serves as the basis for vob_dump.
+libxml2: http://www.xmlsoft.org/
+ImageMagick: http://www.imagemagick.org/
41 TODO
@@ -0,0 +1,41 @@
+DVDAUTHOR
+
+. deal with non-18 byte system headers
+
+. allow different subtitles for p&s, lb, etc
+
+. allow different buttons for p&s, lb, etc
+
+. moving buttons
+
+. make it a library
+
+. improve (and test) audio gap detection
+
+. resurrect buttongroup code
+
+. add support for timers (need optimizer: set two variables at once, or just provide 'settimer(X,Y) function)
+
+. add support for counting GPRMS (i.e. 'g3 counter on;' or 'g3 counter off;')
+
+. allow jumppad to span multiple pgc's
+
+
+SPUMUX
+
+. handle multiple scripts in spumux
+
+. deal with 16 color subtitles
+
+. fix output of spumux (INFO:, ERR:, WARN:)
+
+. deal with multiple subtitle formats
+
+. librarify spumux
+
+. add way to map color->color for generating select images
+
+
+DOCUMENTATION
+
+. provide a full example case on the website, buttons, menus, multiple chapters without pauses, etc.
91 configure.ac
@@ -0,0 +1,91 @@
+AC_INIT(DVDAuthor,0.6.11,dvdauthor-users@lists.sourceforge.net)
+
+AM_CONFIG_HEADER(src/config.h)
+AC_CONFIG_AUX_DIR(autotools)
+
+AM_INIT_AUTOMAKE
+
+AC_PROG_INSTALL
+
+AC_SYS_LARGEFILE
+
+AC_CHECK_LIB(dvdread, DVDOpenFile, , AC_MSG_ERROR([You must have libdvdread(-devel) installed]))
+
+AC_CHECK_LIB(gnugetopt, getopt_long)
+
+dnl AC_CHECK_HEADERS initializes CPP, so must appear outside of any conditionals
+AC_CHECK_HEADERS( \
+ getopt.h \
+ io.h \
+)
+
+AC_CHECK_FUNCS( \
+ strsep \
+ getopt_long \
+ setmode \
+)
+
+AC_CHECK_PROGS(MAGICKCONFIG, [Magick-config GraphicsMagick-config])
+
+usemagick=0
+if test -n "$MAGICKCONFIG"; then
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LIBS="$LIBS"
+ MAGICK_CPPFLAGS="`$MAGICKCONFIG --cppflags`"
+ MAGICK_LIBS="`$MAGICKCONFIG --ldflags` `$MAGICKCONFIG --libs`"
+ CPPFLAGS="$CPPFLAGS $MAGICK_CPPFLAGS"
+ LIBS="$MAGICK_LIBS $LIBS"
+ AC_CHECK_FUNC(ExportImagePixels, usemagick=1, AC_MSG_NOTICE([ImageMagick/GraphicsMagick does not support the function
+ ExportImagePixels. Please upgrade to ImageMagick 5.5.7 or newer (or
+ the corresponding GraphicsMagick version)]))
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIBS="$ac_save_LIBS"
+fi
+
+if test "$usemagick" != 1; then
+ AC_CHECK_LIB(z, zlibVersion, test, AC_MSG_ERROR([You must have libz(-devel) installed]))
+
+ AC_CHECK_LIB(png, png_sig_cmp, test, AC_MSG_ERROR([You must have libpng(-devel) installed]), -lz -lm)
+ MAGICK_CPPFLAGS=
+ MAGICK_LIBS="-lpng -lz -lm"
+else
+ AC_DEFINE(HAVE_MAGICK, 1, [Whether the ImageMagick or GraphicsMagick libraries are available])
+fi
+
+AC_SUBST(MAGICK_CPPFLAGS)
+AC_SUBST(MAGICK_LIBS)
+
+AC_CHECK_PROGS(FRIBIDICONFIG, [fribidi-config])
+if test -n "$FRIBIDICONFIG"; then
+ FRIBIDI_CPPFLAGS="`$FRIBIDICONFIG --cflags`"
+ FRIBIDI_LIBS="`$FRIBIDICONFIG --libs`"
+ AC_DEFINE(HAVE_FRIBIDI, 1, [Whether FriBiDi is available])
+fi
+
+AC_SUBST(FRIBIDI_CPPFLAGS)
+AC_SUBST(FRIBIDI_LIBS)
+
+AC_CHECK_PROGS(FREETYPECONFIG, [freetype-config])
+if test -n "$FREETYPECONFIG"; then
+ FREETYPE_CPPFLAGS="`$FREETYPECONFIG --cflags`"
+ FREETYPE_LIBS="`$FREETYPECONFIG --libs`"
+ AC_DEFINE(HAVE_FREETYPE, 1, [Whether FreeType is available])
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $FREETYPE_CPPFLAGS"
+ AC_CHECK_HEADERS(ft2build.h)
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+AC_SUBST(FREETYPE_CPPFLAGS)
+AC_SUBST(FREETYPE_LIBS)
+
+AM_LANGINFO_CODESET
+
+AM_ICONV
+
+AM_PATH_XML2(2.6.0, , AC_MSG_ERROR([You must have libxml2 >= 2.6.0 installed]))
+
+AC_CHECK_DECLS(O_BINARY, , , [ #include <fcntl.h> ] )
+
+AC_OUTPUT(Makefile doc/Makefile src/Makefile)
17 doc/Makefile.am
@@ -0,0 +1,17 @@
+man1_MANS = dvdauthor.1 spumux.1
+dist_pkgdata_DATA = dvdauthor.xsd spumux.xsd
+
+
+EXTRA_DIST = $(man1_MANS)
+
+$(man1_MANS):
+ rm -f $(man1_MANS)
+ docbook2man root.sgml
+
+.PHONY: html
+
+html:
+ rm -f *.html
+ docbook2html -d html.dsl root.sgml
+
+MAINTAINERCLEANFILES = $(man1_MANS)
538 doc/dvdauthor.sgml
@@ -0,0 +1,538 @@
+<refentry id="dvdauthor">
+
+<refmeta>
+<refentrytitle>dvdauthor</refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname>dvdauthor</refname>
+<refpurpose>assembles multiple mpeg program streams into a suitable DVD filesystem</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>dvdauthor</command>
+<arg>-o <replaceable>output-dir</replaceable></arg>
+<arg choice="req">-x <replaceable>xml-config-file</replaceable></arg>
+</cmdsynopsis>
+<cmdsynopsis>
+<command>dvdauthor</command>
+<arg>-o <replaceable>output-dir</replaceable></arg>
+<group><arg>-j</arg><arg>--jumppad</arg><arg>-g</arg><arg>--allgprm</arg></group>
+<group><arg>-T</arg><arg>--toc</arg></group>
+<arg><replaceable>menu or title options</replaceable></arg>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1><title>DVD Background</title>
+<para>
+
+At a high level, a DVD is a collection of menus and titles.
+Conceptually, a menu contains buttons which can be assigned actions
+and provides a list of choices to the end user, while a title contains
+the main content of the DVD. However, in reality many of the features
+available in menus (including buttons, pausing, and looping) are also
+available in titles.
+
+</para>
+<para>
+
+The menus and titles are divided into titlesets and the VMGM menu set.
+A titleset can contain a number of menus and titles which are meant to
+act together. The "menu", "audio", "subtitle", and "angle" buttons on
+the DVD player's remote control will all access menus in the same
+titleset as the title which is being played. All the titles and menus
+of a given titleset have the same video, audio, and subtitle settings
+(the definitions for the menus are independent from the definitions
+for the titles), so if you want to have different settings (for
+example widescreen vs standard aspect ratios), then you need separate
+titlesets. Titlesets are not meant to jump to one another, so the
+VMGM menu domain is used. It is a collection of menus (no titles)
+that can access the menus and titles of all the titlesets.
+
+</para>
+<para>
+
+One of the most frusterating things when deciding how to author a DVD
+is that there are often many ways to accomplish the same task. For
+example, you must decide whether to locate menus at the VMGM level or
+the titleset level. A typical setup is to locate the high level menus
+at the VMGM level, and the low level configuration menus (scene /
+audio / subtitle selection) at the titleset. If there are DVD extras,
+perhaps with a lower quality audio track and a 4:3 aspect ratio, then
+they would be in a separate titleset with a menu to select among the
+extras located at the titleset level.
+
+</para>
+</refsect1>
+<refsect1><title>dvdauthor Description</title>
+
+<para><command>dvdauthor</command> works in discrete operations. It
+authors each titleset one at a time, and then finally authors the VMGM
+to complete the disc. At that point the contents can be written out
+to a DVD. If you are controlling <command>dvdauthor</command> with
+command line arguments, then each step will occur independently;
+however if you are using the XML configuration file, then you have the
+option of combining some or all the steps into one.</para>
+
+<para>The VOBs passed to <command>dvdauthor</command> must have DVD
+NAV (VOBU) packets multiplexed in at the correct locations. Many
+tools can do this, including <command>mplex</command> from mjpegtools
+1.6.0 or later. <command>dvdauthor</command> will then fill these
+packets in with the correct data. Special care has been taken to
+ensure <command>dvdauthor</command> is fifo compliant; that is every
+source VOB can be the output of another program (such as
+<command>mplex</command>). This can make execution faster on many
+systems by avoiding extra filesystem accesses.</para>
+
+</refsect1>
+
+<refsect1><title>Command Line Description</title>
+
+<variablelist>
+
+<varlistentry><term><literal>-o <replaceable>output-dir</replaceable></literal></term>
+<listitem><para>The destination directory to store the DVD-Video file structure in.</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-j</literal></term><term><literal>--jumppad</literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-g</literal></term><term><literal>--allgprm</literal></term>
+<listitem><para>Enable the use of all 16 general purpose registers. Prohibits the use of jumppad and some complex expressions that require temporary registers.</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-m</literal></term>
+<listitem><para>Creates a menu.</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-t</literal></term>
+<listitem><para>Creates a title.</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-v <replaceable>video-opts</replaceable></literal></term><term><literal>--video=<replaceable>video-opts</replaceable></literal></term>
+<listitem><para>A plus (+) separated list of video options. Dvdauthor
+will try to infer any unspecified options. pal, ntsc, 4:3, 16:9,
+720xfull, 720x576, 720x480, 704xfull, 704x576, 704x480, 352xfull,
+352x576, 352x480, 352xhalf, 352x288, 352x240, nopanscan, noletterbox, crop.
+Default is ntsc, 4:3, 720xfull</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-a <replaceable>audio-opts</replaceable></literal></term><term><literal>--audio=<replaceable>audio-opts</replaceable></literal></term>
+<listitem><para>A plus (+) separated list of options for an audio
+track, with each track separated by a comma (,). For example -a
+ac3+en,mp2+de specifies two audio tracks: the first is an English
+track encoded in AC3, the second is a German track encoded using
+MPEG-1 layer 2 compression. ac3, mp2, pcm, dts, 16bps, 20bps, 24bps,
+drc, surround, nolang, 1ch, 2ch, 3ch, 4ch, 5ch, 6ch, 7ch, 8ch, and any
+two letter ISO 639 language abbreviation. Default is 1 track, mp2,
+20bps, nolang, 2ch. 'ac3' implies drc, 6ch.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-s <replaceable>subpicture-opts</replaceable></literal></term><term><literal>--subpictures=<replaceable>subpicture-opts</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-e <replaceable>entry(s)</replaceable></literal></term><term><literal>--entry=<replaceable>entry(s)</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-p <replaceable>palette-file</replaceable></literal></term><term><literal>--palette=<replaceable>palette-file</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-i <replaceable>commandlist</replaceable></literal></term><term><literal>--instructions=<replaceable>commandlist</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-c <replaceable>chapterpts</replaceable></literal></term><term><literal>--chapters=<replaceable>chapterpts</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-f <replaceable>mpeg-file</replaceable></literal></term><term><literal>--file=<replaceable>mpeg-file</replaceable></literal></term><term><literal><replaceable>mpeg-file</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>-b <replaceable>buttondef</replaceable></literal></term><term><literal>--button=<replaceable>buttondef</replaceable></literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+</variablelist>
+
+</refsect1>
+
+<refsect1><title>XML Description</title>
+<para>
+Here is the basic structure of the configuration file:
+</para>
+<synopsis>
+&lt;dvdauthor [dest="<replaceable>output-dir</replaceable>"] [jumppad="1|on|yes" | allgprm="1|on|yes"]&gt;
+ &lt;vmgm&gt;
+ [&lt;fpc&gt;<replaceable>commands;</replaceable>&lt;/fpc&gt;]
+ &lt;menus [lang="<replaceable>language-code</replaceable>"] &gt;
+ &lt;video [format="ntsc|pal"] [aspect="4:3|16:9"]
+ [resolution="<replaceable>XxY</replaceable>"] [caption="field1|field2"]
+ [widescreen="nopanscan|noletterbox|crop"] /&gt;
+ &lt;audio [format="mp2|ac3|dts|pcm"] [channels="<replaceable>numchannels</replaceable>"]
+ [quant="16bps|20bps|24bps|drc"] [dolby="surround"]
+ [samplerate="48khz|96khz"] [lang="<replaceable>language</replaceable>"] /&gt;
+ [&lt;audio ... /&gt;]
+ &lt;subpicture lang="<replaceable>language</replaceable>" /&gt;
+ &lt;pgc [entry="title"] [palette="<replaceable>yuvfile|rgbfile</replaceable>"]
+ [pause="<replaceable>seconds</replaceable>|inf"]&gt;
+ &lt;pre&gt; <replaceable>commands;</replaceable> &lt;/pre&gt;
+ &lt;vob file="<replaceable>file.mpg</replaceable>" [chapters="<replaceable>chapter-list</replaceable>"]
+ [pause="<replaceable>seconds</replaceable>|inf"] /&gt;
+ [&lt;vob ... /&gt;]
+ &lt;button [name="<replaceable>buttonname</replaceable>"]&gt; <replaceable>commands;</replaceable> &lt;/button&gt;
+ [&lt;button ... /&gt;]
+ &lt;post&gt; <replaceable>commands;</replaceable> &lt;/post&gt;
+ &lt;/pgc&gt;
+ [&lt;pgc ... /&gt;]
+ &lt;/menus&gt;
+ &lt;/vmgm&gt;
+ &lt;titleset&gt;
+ &lt;menus&gt;
+ [&lt;video ... /&gt;]
+ [&lt;audio ... /&gt;]
+ &lt;pgc [entry="<replaceable>entries</replaceable>"]
+ [palette="<replaceable>yuvfile|rgbfile</replaceable>"] [pause="<replaceable>seconds</replaceable>|inf"]&gt;
+ [...]
+ &lt;/pgc&gt;
+ [&lt;pgc ... /&gt;]
+ &lt;/menus&gt;
+ &lt;titles&gt;
+ [&lt;video ... /&gt;]
+ [&lt;audio ... /&gt;]
+ &lt;pgc [palette="<replaceable>yuvfile|rgbfile</replaceable>"] [pause="<replaceable>seconds</replaceable>|inf"]&gt;
+ [...]
+ &lt;/pgc&gt;
+ [&lt;pgc ... /&gt;]
+ &lt;/titles&gt;
+ &lt;/titleset&gt;
+ [&lt;titleset ... /&gt;]
+&lt;/dvdauthor&gt;
+</synopsis>
+
+<para>
+A breakdown of the config file:
+</para>
+
+<variablelist>
+
+<varlistentry><term><literal>&lt;dvdauthor [dest="<replaceable>output-dir</replaceable>"] [jumppad="1|on|yes" | allgprm="1|on|yes"]&gt;</literal></term>
+<listitem><para>
+Initiates dvdauthor. <literal>dest</literal> denotes the directory where <command>dvdauthor</command> will write the files. It overrides the <literal>-o</literal> option. Contains up to one <literal>&lt;vmgm&gt;</literal> tag and any number of <literal>&lt;titleset&gt;</literal>'s.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;vmgm&gt;</literal></term><term><literal>&lt;titleset&gt;</literal></term>
+<listitem><para>Constructs of a VMGM level menu set or a title set.
+Contains up to one <literal>&lt;menus&gt;</literal> tag and if a
+titleset, up to one <literal>&lt;titles&gt;</literal> tag.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;menus
+[lang="<replaceable>language-code</replaceable>"]
+&gt;</literal></term><term><literal>&lt;titles&gt;</literal></term>
+<listitem><para>Marks the list of menus or titles for this VMGM menu
+set or titleset, called in <command>dvdauthor</command> terminology a
+"pgcgroup." Contains up to one <literal>&lt;video&gt;</literal> tag,
+up to eight <literal>&lt;audio&gt;</literal> tags, up to 32
+<literal>&lt;subpicture&gt;</literal> tags, and any number of
+<literal>&lt;pgc&gt;</literal> tags.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;video [format="ntsc|pal"]
+[aspect="4:3|16:9"] [resolution="<replaceable>XxY</replaceable>"]
+[caption="field1|field2"] [widescreen="nopanscan|noletterbox|crop"]
+/&gt;</literal></term> <listitem><para> Manually configures the video
+parameters for this pgcgroup. If any of these are not set, then they
+will be inferred from the source stream. Note that the DVD format
+only specifically supports 720x480, 704x480, 352x480, and 352x240
+resolutions for NTSC, and 720x576, 704x576, 352x576, and 352x288
+resolutions for PAL, but DVD author will accept a wider range of
+inputs and round up to the nearest size.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;audio [format="mp2|ac3|dts|pcm"]
+[channels="<replaceable>numchannels</replaceable>"]
+[dolby="surround"] [quant="16bps|20bps|24bps|drc"] [samplerate="48khz|96khz"]
+[lang="<replaceable>language</replaceable>"] /&gt;</literal></term>
+<listitem><para>Manually configures an audio channel for this
+pgcgroup. List once for each channel. Most parameters are inferred
+automatically from the source VOBs except for PCM parameters.
+However, language must be manually specified. Note that it is
+possible to just list the language attribute and let
+<command>dvdauthor</command> fill in the rest.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;subpicture
+lang="<replaceable>language</replaceable>" /&gt;</literal></term>
+<listitem><para>foo</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;pgc
+[entry="<replaceable>entries</replaceable>"]
+[palette="<replaceable>yuvfile|rgbfile</replaceable>"]
+[pause="<replaceable>seconds</replaceable>|inf"]&gt;</literal></term>
+<listitem><para>A PGC is just a fancy term for either a menu or a
+title. It has a special meaning in the DVD spec so I have retained
+its use here. PGC's can have commands that get executed before they
+start playing or after they finish; see <literal>pre</literal> and
+<literal>post</literal> tags below.</para>
+
+<para>If the PGC is a menu, you can specify one or more entries for
+it. This means that if you press the corresponding button on your DVD
+remote, then it will go to this menu. For a VMGM level menu, the only
+choice is <literal>title</literal>, which on my remote corresponds to
+the <literal>top menu</literal> button. For a titleset level menu,
+you can use root, subtitle, audio, angle, and ptt. If you want more
+than one, separate them by a space or a comma. Note that
+<literal>root</literal> entry is meant for commands that jump from a
+VMGM level menu to a titleset menu.</para>
+
+<para>All button and menu masks and all subtitles within a PGC must
+share the same 16 color palette. If you use <command>spumux</command>
+to generate the subtitle/subpicture packets, then the color
+information will be automatically passed to
+<command>dvdauthor</command>; however, if you use another subtitler or
+want to have more control over the palette, you can manually specify
+it with the <literal>palette</literal> attribute. The first 16
+entries of the file should be the 16 colors of the palette, listed as
+6 digit hexadecimal numbers representing either the RGB breakdown (if
+the filename ends in <literal>.rgb</literal> or the YUV breakdown (if
+the filename does not end in <literal>.rgb</literal>. After that, the
+button group information can be listed as pairs of 8 digit hexadecimal
+numbers; up to three button groups may be specified.</para>
+
+<para>If you have a short video sequence or just want the video to
+pause at the end, you can use the <literal>pause</literal> attribute
+to set the number of seconds (as an integer) from 1 to 254. If you
+want the video to pause indefinitely, use
+<literal>inf</literal>.</para>
+
+</listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;pre&gt; <replaceable>commands;</replaceable> &lt;/pre&gt;</literal></term>
+<term><literal>&lt;post&gt; <replaceable>commands;</replaceable> &lt;/post&gt;</literal></term>
+<listitem><para> Sets the commands to execute before or after a PGC
+plays. It can be used to loop the current video (by having a
+<literal>&lt;post&gt; jump ... &lt;/post&gt</literal> sequence), or to
+conditionally skip certain chapters if a flag has been set.
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;fpc&gt; <replaceable>commands;</replaceable> &lt;/fpc&gt;</literal></term>
+<listitem><para> Sets the commands to execute when the disk is first
+put in the player (FPC = First Program Chain). It can be used to jump
+to a particular menu or initialize registers on startup. If not
+specified, an implicit one will be created that jumps to the first
+menu found, or if there is no menu it will jump to the first title..
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;vob file="<replaceable>file.mpg</replaceable>" [chapters="<replaceable>chapter-list</replaceable>"] [pause="<replaceable>seconds</replaceable>|inf"] /&gt;</literal></term>
+<listitem><para>
+foo
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;cell [start="<replaceable>timestamp</replaceable>"] [end="<replaceable>timestamp</replaceable>"] [chapter="1|on|yes" | program="1|on|yes"] [pause="<replaceable>seconds</replaceable>|inf"] /&gt;</literal></term>
+<listitem><para>
+foo
+</para></listitem></varlistentry>
+
+<varlistentry><term><literal>&lt;button [name="<replaceable>buttonname</replaceable>"]&gt; <replaceable>commands;</replaceable> &lt;/button&gt;</literal></term>
+<listitem><para>
+foo
+</para></listitem></varlistentry>
+
+</variablelist>
+
+</refsect1>
+
+<refsect1><title>Language Description</title>
+<para>
+The language is quite simple and roughly looks like C.
+</para>
+<itemizedlist>
+<listitem><para>Statements are terminated with a semicolon.</para></listitem>
+<listitem><para>Statements can span multiple lines.</para></listitem>
+<listitem><para>Multiple statements can appear on one line.</para></listitem>
+<listitem><para>Whitespace (space, tab, newlines) are not important, except to separate keywords and identifiers.</para></listitem>
+</itemizedlist>
+
+<refsect2><title>Variables</title>
+
+<para>The DVD virtual machine processes 16 bit values. It supports up
+to 16 general purpose registers; however <command>dvdauthor</command>
+reserves 3 for internal use. Thus register 0-12 are avaialable for
+use and are referred to as <literal>g0</literal> through
+<literal>g12</literal>.</para>
+
+<para>There are also 24 system registers, which can be referred to as
+<literal>s0</literal> through <literal>s23</literal>. Not all of
+these can be set. Many of these have pseodonyms.</para>
+
+<glosslist>
+
+<glossentry><glossterm><literal>audio</literal>
+(<literal>s1</literal>, rw)</glossterm><glossdef><para>Denotes the
+audio channel, ranging from 0-7.</para></glossdef></glossentry>
+
+<glossentry><glossterm><literal>subtitle</literal>
+(<literal>s2</literal>, rw)</glossterm><glossdef><para>The subtitle
+track, ranging from 0-31. If you want the subtitle to always be
+displayed, then you should add 64 (i.e. choose 64-95). Simply
+selecting the track (0-31) means that only the forced subtitles will
+be displayed, whereas enabling the track (64-95) means that all the
+subtitles will be displayed. This allows you to have forced subtitles
+only for the parts of the movie where the actors are speaking a
+foreign (to the viewer) language, but still have normal subtitles for
+the hearing impaired. The hearing impaired viewers would enable the
+track (64-95) while the other viewers would just select the track
+(0-31) they would be able to share the
+track.</para></glossdef></glossentry>
+
+<glossentry><glossterm><literal>angle</literal>
+(<literal>s3</literal>, rw)</glossterm><glossdef><para>Selects the
+angle (currently untested).</para></glossdef></glossentry>
+
+<glossentry><glossterm><literal>button</literal>
+(<literal>s8</literal>, rw)</glossterm><glossdef><para>Denotes the
+currently highlighted button. Note that the value is multiplied by
+1024, so the first button is 1024, the second is 2048,
+etc.</para></glossdef></glossentry>
+
+</glosslist>
+
+</refsect2>
+
+<refsect2><title>Expressions</title>
+
+<para>Expressions follow typical C syntax except that booleans are not
+convertible to integers and vice versa. Operators and comparisons
+are:</para>
+
+<para>
+<simplelist type="inline" columns="6">
+<member><literal>==</literal></>
+<member><literal>!=</literal></>
+<member><literal>&gt;=</literal></>
+<member><literal>&gt;</literal></>
+<member><literal>&lt;=</literal></>
+<member><literal>&lt;</literal></>
+<member><literal>&amp;&amp;</literal></>
+<member><literal>||</literal></>
+<member><literal>!</literal></>
+<member><literal>eq</literal></>
+<member><literal>ne</literal></>
+<member><literal>ge</literal></>
+<member><literal>gt</literal></>
+<member><literal>le</literal></>
+<member><literal>lt</literal></>
+<member><literal>and</literal></>
+<member><literal>or</literal></>
+<member><literal>xor</literal></>
+<member><literal>not</literal></>
+<member><literal>+</literal></>
+<member><literal>-</literal></>
+<member><literal>*</literal></>
+<member><literal>/</literal></>
+<member><literal>%</literal></>
+<member><literal>&</literal></>
+<member><literal>|</literal></>
+<member><literal>^</literal></>
+</simplelist>
+</para>
+
+<para>Since the code is encapsulated in XML, the parser will catch any
+unescaped &lt; characters, thus alphabetic mnemonics have been
+provided for all comparison operators for consistency.</para>
+
+<para>There is also a numerical function:</para>
+
+<variablelist>
+
+<varlistentry><term><literal>random(<replaceable>EXPRESSION</replaceable>)</literal></term>
+<listitem><para>Computes a psuedo-random number, between 1 and the
+supplied number, inclusively.</para> </listitem></varlistentry>
+
+</variablelist>
+
+</refsect2>
+
+<refsect2><title>Blocks</title>
+
+<para>Blocks are either a single statement (terminated by a
+semicolon), or a group of statements wrapped in curly braces. For
+example:</para>
+
+<itemizedlist>
+
+<listitem><synopsis>g3=s7;</synopsis></listitem>
+<listitem><synopsis>{
+ audio=1;
+ subtitle=65;
+ jump vmgm menu 3;
+}</synopsis></listitem>
+
+</itemizedlist>
+
+</refsect2>
+
+<refsect2><title>Statements</title>
+
+<para>The statements supported are fairly simple at the moment.</para>
+
+<variablelist>
+
+<varlistentry>
+<term><literal><replaceable>VARIABLE</replaceable>=<replaceable>EXPRESSION</replaceable>;</literal></term>
+<listitem><para>Sets a variable equal to the result of an equation.</para></listitem></varlistentry>
+
+<varlistentry>
+<term><literal>if (<replaceable>EXPRESSION</replaceable>) <replaceable>BLOCK;</replaceable></literal></term>
+<term><literal>if (<replaceable>EXPRESSION</replaceable>) <replaceable>BLOCK;</replaceable> else <replaceable>BLOCK;</replaceable></literal></term>
+
+<listitem><para>Calculates the expression; if true, then it executes
+the block of code.</para></listitem></varlistentry>
+
+<varlistentry><term><literal>jump <replaceable>TARGET</replaceable>;</literal></term>
+<term><literal>call <replaceable>TARGET</replaceable> [resume <replaceable>CELL</replaceable>];</literal></term>
+<term><literal>resume;</literal></term>
+
+<listitem><para>Jumps to a particular title or menu, or calls a
+particular menu, or returns to the calling title. You can only
+execute a call from a title to a menu; all other forms are illegal.
+The purpose of using <literal>call</literal> instead of
+<literal>jump</literal> (besides the fact that they support a mutually
+exclusive list of targets) is to allow the menu to return to the point
+in the title where the call originated using
+<literal>resume</literal>. You can manually specify the return cell
+by using the <literal>resume</literal> keyword, however if you do not
+specify one and you use the command in a post instruction block, then
+it will presume cell 1.</para>
+
+<para>The following are possible targets:</para>
+<variablelist>
+
+<varlistentry>
+<term><literal>[vmgm | titleset <replaceable>X</replaceable>] menu</literal></term>
+<term><literal>[vmgm | titleset <replaceable>X</replaceable>] menu <replaceable>Y</replaceable></literal></term>
+<term><literal>[vmgm | titleset <replaceable>X</replaceable>] menu entry <replaceable>Z</replaceable></literal></term>
+<listitem><para>Targets either the default menu, a menu number Y, or the menu denoted as the entry for Z. The menu is in either the VMGM or titleset domain. If you wish to target a menu in the current domain then you can omit the domain moniker.</para></listitem></varlistentry>
+
+<varlistentry>
+<term><literal>[vmgm | titleset <replaceable>X</replaceable>] title <replaceable>Y</replaceable> [chapter <replaceable>Z</replaceable>]</literal></term>
+<listitem><para>Targets a title, or a chapter in a title. Numbering
+starts at 1. All of the titles on the disc are accessible in the VMGM
+domain, or you can access them by titleset
+instead.</para></listitem></varlistentry>
+
+<varlistentry>
+<term><literal>chapter <replaceable>Z</replaceable></literal></term>
+<term><literal>program <replaceable>Z</replaceable></literal></term>
+<term><literal>cell <replaceable>Z</replaceable></literal></term>
+
+<listitem><para>Targets a chapter, program, or cell in the current
+title or menu (note that menus do not have chapters). You can use
+this to create looping menus: <literal>jump cell
+1;</literal></para></listitem></varlistentry>
+
+</variablelist>
+
+</listitem></varlistentry>
+
+</variablelist>
+
+</refsect2>
+
+</refsect1>
+
+</refentry>
198 doc/dvdauthor.xsd
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ XML Schema Definition for dvdauthor.
+ Author: Alan Canon (acanon@bellsouth.net)
+ Date: Jan 8 2005
+ This Schema is made available under the terms of the GNU GPL.
+ See http://www.gnu.org/ for details.
+ // TODO Copy the dvdauthor man page documentation as xsd:annotations to the below.
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="dvdauthor" type="DvdauthorType"/>
+
+ <xsd:complexType name="DvdauthorType">
+ <xsd:sequence>
+ <xsd:element name="vmgm" type="VmgmType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="titleset" type="TitlesetType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="dest" type="xsd:string"/>
+ <xsd:attribute name="jumppad" type="xsd:string"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="VmgmType">
+ <xsd:sequence>
+ <xsd:element name="menus" type="MenusType" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="TitlesetType">
+ <xsd:complexContent>
+ <xsd:extension base="VmgmType">
+ <xsd:sequence>
+ <xsd:element name="titles" type="TitlesType" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="TitlesType">
+ <xsd:sequence>
+ <xsd:element name="video" type="VideoType" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="audio" type="AudioType" minOccurs="0" maxOccurs="8"/>
+ <xsd:element name="subpicture" type="SubpictureType" minOccurs="0" maxOccurs="32"/>
+ <xsd:element name="pgc" type="PgcType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="MenusType">
+ <xsd:complexContent>
+ <xsd:extension base="TitlesType">
+ <xsd:attribute name="lang" type="xsd:string"/>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="VideoType">
+ <xsd:attribute name="format" type="VideoFormatType"/>
+ <xsd:attribute name="aspect" type="VideoAspectType"/>
+ <!-- XxY -->
+ <xsd:attribute name="resolution" type="xsd:string"/>
+ <xsd:attribute name="caption" type="VideoCaptionType"/>
+
+ <xsd:attribute name="widescreen" type="VideoWidescreenType"/>
+ </xsd:complexType>
+
+ <xsd:simpleType name="VideoFormatType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ntsc"/>
+ <xsd:enumeration value="pal"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="VideoAspectType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="4:3"/>
+ <xsd:enumeration value="16:9"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="VideoCaptionType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="field1"/>
+ <xsd:enumeration value="field2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+
+ <xsd:simpleType name="VideoWidescreenType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="nopanscan"/>
+ <xsd:enumeration value="noletterbox"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="AudioType">
+ <xsd:attribute name="format" type="AudioFormatType"/>
+ <xsd:attribute name="channels" type="xsd:integer"/>
+ <xsd:attribute name="dolby" type="AudioDolbyType"/>
+ <xsd:attribute name="quant" type="AudioQuantType"/>
+ <xsd:attribute name="samplerate" type="AudioSamplerateType"/>
+ <xsd:attribute name="lang" type="xsd:string"/>
+ </xsd:complexType>
+
+ <xsd:simpleType name="AudioSamplerateType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="48khz"/>
+ <xsd:enumeration value="96khz"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="AudioDolbyType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="surround"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="AudioFormatType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="mp2"/>
+ <xsd:enumeration value="ac3"/>
+ <xsd:enumeration value="dts"/>
+ <xsd:enumeration value="pcm"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="AudioQuantType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="16bps"/>
+ <xsd:enumeration value="20bps"/>
+ <xsd:enumeration value="24bps"/>
+ <xsd:enumeration value="drc"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="PgcEntryType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="title"/>
+ <xsd:enumeration value="root"/>
+ <xsd:enumeration value="subtitle"/>
+ <xsd:enumeration value="audio"/>
+ <xsd:enumeration value="angle"/>
+ <xsd:enumeration value="ptt"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="PgcType">
+ <xsd:sequence>
+ <xsd:element name="pre" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="vob" type="VobType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="button" type="ButtonType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="post" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ <xsd:attribute name="palette" type="xsd:string"/>
+ <xsd:attribute name="pause" type="PauseType"/>
+ <xsd:attribute name="entry" type="PgcEntryType"/>
+ </xsd:complexType>
+
+ <xsd:simpleType name="PauseType">
+ <xsd:annotation>
+ <xsd:documentation>for pgc {entry} attibute</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="1"/>
+ <xsd:maxInclusive value="254"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:NMTOKEN">
+ <xsd:enumeration value="inf"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:union>
+ </xsd:simpleType>
+
+ <xsd:complexType name="ButtonType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="name" type="xsd:string"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="SubpictureType">
+ <xsd:attribute name="lang" type="xsd:string"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="VobType">
+ <xsd:attribute name="file" type="xsd:string"/>
+ <xsd:attribute name="chapters" type="xsd:string"/>
+ <xsd:attribute name="pause" type="PauseType"/>
+ </xsd:complexType>
+
+</xsd:schema>
189 doc/examples.sgml
@@ -0,0 +1,189 @@
+<chapter id="examples"><title>Examples</title>
+
+<sect1 id="ex-tools"><title>Running the tools</title>
+
+<sect2><title>Creating the DVD filesystem with dvdauthor</title>
+
+<para>In these examples, <command>dvdauthor</command> is run as:</para>
+<programlisting>rm -r test && dvdauthor -o test -x dvdauthor.xml</programlisting>
+
+<para>It will create or append to the directory specified, so it is a
+good idea to remove the directory before running
+<command>dvdauthor</command>, otherwise the resulting structure will
+not be playable.</para>
+
+</sect2>
+
+<sect2><title>Adding subtitles with spumux</title>
+
+<para><command>spumux</command> takes an mpeg2 program stream as input and spits one back out, with subtitles multiplexed in. It is run as:</para>
+<programlisting>spumux spumux.xml &lt; input.mpg &gt; output.mpg</programlisting>
+
+</sect2>
+
+<sect2><title>Creating a movie source from video and audio with mplex</title>
+
+<para><command>mplex</command> comes from the mjpegtools package,
+available at http://mjpeg.sourceforge.net. It can take independent
+video and audio streams and create a single mpeg2 stream.</para>
+<programlisting>mplex -f 8 -o output.mpg video.m2v audio.m2a</programlisting>
+
+</sect2>
+
+<sect2><title>Creating video from bitmap images with mpeg2enc</title>
+
+<para>When creating menus, it is necessary to create an mpeg2 video stream from one or more bitmap images. For NTSC you can do:</para>
+<programlisting>ppmtoy4m | mpeg2enc -a 2 -n n -f 8 -o output.m2v</programlisting>
+<para>and for PAL you can do:</para>
+<programlisting>ppmtoy4m | mpeg2enc -a 2 -n p -f 8 -o output.m2v</programlisting>
+
+</sect2>
+
+<sect2><title>Creating a blank audio track with toolame</title>
+
+<para>When creating menus with no sound, it is necessary to multiplex
+in an empty sound file. At 48kHz, NTSC has 1601.6 audio samples per
+frame while PAL has 1920 audio samples per frame. Determine how many
+samples you need, and run:</para>
+<programlisting>dd if=/dev/zero bs=4 count=<replaceable>number-of-samples</replaceable> | toolame -b 128 -s 48 /dev/stdin output.m2a</programlisting>
+
+</sect2>
+
+</sect1>
+
+<sect1 id="ex-title"><title>Creating a title</title>
+
+<sect2><title>One chapter, one source</title>
+<para>This forms the most basic DVD. THe DVD player will start playing the movie when the disc is inserted and will stop at the end.</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc>
+ <vob file="video.mpg" />
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+</sect2>
+
+
+<sect2><title>Two chapters, two sources</title>
+<para>Adding a second chapter is quite simple if it is in a separate file.</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc>
+ <vob file="video1.mpg" />
+ <vob file="video2.mpg" />
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+</sect2>
+
+
+<sect2><title>One chapter, two sources</title>
+<para><application>DVDAuthor</application> normally creates one
+chapter per file. This can be overridden using
+<literal>chapters="<replaceable>foo</replaceable>"</literal>. The
+parameter is a comma separated list of timestamps of the form
+<literal>[[<replaceable>HH</replaceable>:]<replaceable>MM</replaceable>:]<replaceable>SS</replaceable></literal>.</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc>
+ <vob file="video1.mpg" chapters="0" />
+ <vob file="video2.mpg" />
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+</sect2>
+
+
+<sect2><title>Two chapters, one source</title>
+<para>This will create a movie with two chapters, one at the beginning (which is always required) and one five minutes into the video.</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc>
+ <vob file="video1.mpg" chapters="0,5:00" />
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+</sect2>
+
+
+<sect2><title>Looping</title>
+<para>Having <literal>&lt;post&gt;</literal>commands will alter what happens when playback reaches the end of your title. You can repeat the current title by jumping to the first chapter.</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc>
+ <vob file="video1.mpg" />
+ <post>
+ jump chapter 1;
+ </post>
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+</sect2>
+
+
+<sect2><title>Pausing</title>
+<para>Having <literal>pause="<replaceable>foo</replaceable>"</literal>
+will cause playback to pause for either the specified number of
+seconds or indefinitely (<literal>inf</literal>). This can be used
+either at the end of the title (by supplying it as an attribute to
+<literal>pgc</literal> or at the end of a particular source, as an
+attribute to <literal>vob</literal>. The following will pause
+indefinitely at the end of the title:</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc pause="inf">
+ <vob file="video1.mpg" />
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+
+<para>while the following will pause for 5 seconds after the first chapter:</para>
+<programlisting><![CDATA[
+<dvdauthor>
+ <vmgm />
+ <titleset>
+ <titles>
+ <pgc>
+ <vob file="video1.mpg" pause="5" />
+ <vob file="video2.mpg" />
+ </pgc>
+ </titles>
+ </titleset>
+</dvdauthor>
+]]></programlisting>
+</sect2>
+
+</sect1>
+
+</chapter>
41 doc/html.dsl
@@ -0,0 +1,41 @@
+<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
+<!ENTITY docbook.dsl PUBLIC "-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN" CDATA dsssl>
+]>
+<style-sheet>
+<style-specification id="html" use="docbook">
+<style-specification-body>
+
+(define %chapter-autolabel% #t)
+(define %section-autolabel% #t)
+(define (toc-depth nd) 3)
+
+; (declare-characteristic preserve-sdata?
+; "UNREGISTERED::James Clark//Characteristic::preserve-sdata?"
+; #f)
+
+(define %root-filename% "index") ;; name for the root html file
+
+;;Use element ids as filenames?
+(define %use-id-as-filename%
+ #t)
+
+;;Default extension for filenames?
+(define %html-ext%
+ ".html")
+
+; === Rendering ===
+(define %admon-graphics% #t) ;; use symbols for Caution|Important|Note|Tip|Warning
+
+; === Books only ===
+(define %generate-book-titlepage% #t)
+(define %generate-book-toc% #t)
+(define ($generate-chapter-toc$) #f) ;; never generate a chapter TOC in books
+
+; === HTML settings ===
+(define %html-pubid% "-//W3C//DTD HTML 4.01 Transitional//EN") ;; Nearly true :-(
+(define %html40% #t)
+
+</style-specification-body>
+</style-specification>
+<external-specification id="docbook" document="docbook.dsl">
+</style-sheet>
485 doc/iso639.sgml
@@ -0,0 +1,485 @@
+<appendix id="languages"><title>Language Codes</title>
+
+<para>The following are the ISO 639 langauges codes, adapted from
+<computeroutput>http://sunsite.berkeley.edu/amher/iso_639.html</computeroutput>.</para>
+
+<table><title>Sorted By Language Name</title>
+<tgroup cols=3>
+<thead><row><entry>Langauge Name</entry><entry>Code</entry><entry>Language Family</entry></row></thead>
+<tbody>
+<row><entry>ABKHAZIAN</entry><entry>AB</entry><entry>IBERO-CAUCASIAN</entry></row>
+<row><entry>AFAN (OROMO)</entry><entry>OM</entry><entry>HAMITIC</entry></row>
+<row><entry>AFAR</entry><entry>AA</entry><entry>HAMITIC</entry></row>
+<row><entry>AFRIKAANS</entry><entry>AF</entry><entry>GERMANIC</entry></row>
+<row><entry>ALBANIAN</entry><entry>SQ</entry><entry>INDO-EUROPEAN (OTHER)</entry></row>
+<row><entry>AMHARIC</entry><entry>AM</entry><entry>SEMITIC</entry></row>
+<row><entry>ARABIC</entry><entry>AR</entry><entry>SEMITIC</entry></row>
+<row><entry>ARMENIAN</entry><entry>HY</entry><entry>INDO-EUROPEAN (OTHER)</entry></row>
+<row><entry>ASSAMESE</entry><entry>AS</entry><entry>INDIAN</entry></row>
+<row><entry>AYMARA</entry><entry>AY</entry><entry>AMERINDIAN</entry></row>
+<row><entry>AZERBAIJANI</entry><entry>AZ</entry><entry>TURKIC/ALTAIC</entry></row>
+
+<row><entry>BASHKIR</entry><entry>BA</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>BASQUE</entry><entry>EU</entry><entry>BASQUE</entry></row>
+<row><entry>BENGALI;BANGLA</entry><entry>BN</entry><entry>INDIAN</entry></row>
+<row><entry>BHUTANI</entry><entry>DZ</entry><entry>ASIAN</entry></row>
+<row><entry>BIHARI</entry><entry>BH</entry><entry>INDIAN</entry></row>
+<row><entry>BISLAMA</entry><entry>BI</entry><entry>[not given]</entry></row>
+<row><entry>BRETON</entry><entry>BR</entry><entry>CELTIC</entry></row>
+<row><entry>BULGARIAN</entry><entry>BG</entry><entry>SLAVIC</entry></row>
+<row><entry>BURMESE</entry><entry>MY</entry><entry>ASIAN</entry></row>
+<row><entry>BYELORUSSIAN</entry><entry>BE</entry><entry>SLAVIC</entry></row>
+
+<row><entry>CAMBODIAN</entry><entry>KM</entry><entry>ASIAN</entry></row>
+<row><entry>CATALAN</entry><entry>CA</entry><entry>ROMANCE</entry></row>
+<row><entry>CHINESE</entry><entry>ZH</entry><entry>ASIAN</entry></row>
+<row><entry>CORSICAN</entry><entry>CO</entry><entry>ROMANCE</entry></row>
+<row><entry>CROATIAN</entry><entry>HR</entry><entry>SLAVIC</entry></row>
+<row><entry>CZECH</entry><entry>CS</entry><entry>SLAVIC</entry></row>
+
+<row><entry>DANISH</entry><entry>DA</entry><entry>GERMANIC</entry></row>
+<row><entry>DUTCH</entry><entry>NL</entry><entry>GERMANIC</entry></row>
+
+<row><entry>ENGLISH</entry><entry>EN</entry><entry>GERMANIC</entry></row>
+<row><entry>ESPERANTO</entry><entry>EO</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>ESTONIAN</entry><entry>ET</entry><entry>FINNO-UGRIC</entry></row>
+
+<row><entry>FAROESE</entry><entry>FO</entry><entry>GERMANIC</entry></row>
+<row><entry>FIJI</entry><entry>FJ</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>FINNISH</entry><entry>FI</entry><entry>FINNO-UGRIC</entry></row>
+<row><entry>FRENCH</entry><entry>FR</entry><entry>ROMANCE</entry></row>
+<row><entry>FRISIAN</entry><entry>FY</entry><entry>GERMANIC</entry></row>
+
+<row><entry>GALICIAN</entry><entry>GL</entry><entry>ROMANCE</entry></row>
+<row><entry>GEORGIAN</entry><entry>KA</entry><entry>IBERO-CAUCASIAN</entry></row>
+<row><entry>GERMAN</entry><entry>DE</entry><entry>GERMANIC</entry></row>
+<row><entry>GREEK</entry><entry>EL</entry><entry>LATIN/GREEK</entry></row>
+<row><entry>GREENLANDIC</entry><entry>KL</entry><entry>ESKIMO</entry></row>
+<row><entry>GUARANI</entry><entry>GN</entry><entry>AMERINDIAN</entry></row>
+<row><entry>GUJARATI</entry><entry>GU</entry><entry>INDIAN</entry></row>
+
+<row><entry>HAUSA</entry><entry>HA</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>HEBREW</entry><entry>IW</entry><entry>SEMITIC</entry></row>
+<row><entry>HINDI</entry><entry>HI</entry><entry>INDIAN</entry></row>
+<row><entry>HUNGARIAN</entry><entry>HU</entry><entry>FINNO-UGRIC</entry></row>
+
+<row><entry>ICELANDIC</entry><entry>IS</entry><entry>GERMANIC</entry></row>
+<row><entry>INDONESIAN</entry><entry>IN</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>INTERLINGUA</entry><entry>IA</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>INTERLINGUE</entry><entry>IE</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>INUPIAK</entry><entry>IK</entry><entry>ESKIMO</entry></row>
+<row><entry>IRISH</entry><entry>GA</entry><entry>CELTIC</entry></row>
+<row><entry>ITALIAN</entry><entry>IT</entry><entry>ROMANCE</entry></row>
+
+<row><entry>JAPANESE</entry><entry>JA</entry><entry>ASIAN</entry></row>
+<row><entry>JAVANESE</entry><entry>JV</entry><entry>OCEANIC/INDONESIAN</entry></row>
+
+<row><entry>KANNADA</entry><entry>KN</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>KASHMIRI</entry><entry>KS</entry><entry>INDIAN</entry></row>
+<row><entry>KAZAKH</entry><entry>KK</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>KINYARWANDA</entry><entry>RW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>KIRGHIZ</entry><entry>KY</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>KURUNDI</entry><entry>RN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>KOREAN</entry><entry>KO</entry><entry>ASIAN</entry></row>
+<row><entry>KURDISH</entry><entry>KU</entry><entry>IRANIAN</entry></row>
+
+<row><entry>LAOTHIAN</entry><entry>LO</entry><entry>ASIAN</entry></row>
+<row><entry>LATIN</entry><entry>LA</entry><entry>LATIN/GREEK</entry></row>
+<row><entry>LATVIAN;LETTISH</entry><entry>LV</entry><entry>BALTIC</entry></row>
+<row><entry>LINGALA</entry><entry>LN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>LITHUANIAN</entry><entry>LT</entry><entry>BALTIC</entry></row>
+
+<row><entry>MACEDONIAN</entry><entry>MK</entry><entry>SLAVIC</entry></row>
+<row><entry>MALAGASY</entry><entry>MG</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MALAY</entry><entry>MS</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MALAYALAM</entry><entry>ML</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>MALTESE</entry><entry>MT</entry><entry>SEMITIC</entry></row>
+<row><entry>MAORI</entry><entry>MI</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MARATHI</entry><entry>MR</entry><entry>INDIAN</entry></row>
+<row><entry>MOLDAVIAN</entry><entry>MO</entry><entry>ROMANCE</entry></row>
+<row><entry>MONGOLIAN</entry><entry>MN</entry><entry>[not given]</entry></row>
+
+<row><entry>NAURU</entry><entry>NA</entry><entry>[not given]</entry></row>
+<row><entry>NEPALI</entry><entry>NE</entry><entry>INDIAN</entry></row>
+<row><entry>NORWEGIAN</entry><entry>NO</entry><entry>GERMANIC</entry></row>
+
+<row><entry>OCCITAN</entry><entry>OC</entry><entry>ROMANCE</entry></row>
+<row><entry>ORIYA</entry><entry>OR</entry><entry>INDIAN</entry></row>
+
+<row><entry>PASHTO;PUSHTO</entry><entry>PS</entry><entry>IRANIAN</entry></row>
+<row><entry>PERSIAN (farsi)</entry><entry>FA</entry><entry>IRANIAN</entry></row>
+<row><entry>POLISH</entry><entry>PL</entry><entry>SLAVIC</entry></row>
+<row><entry>PORTUGUESE</entry><entry>PT</entry><entry>ROMANCE</entry></row>
+<row><entry>PUNJABI</entry><entry>PA</entry><entry>INDIAN</entry></row>
+
+<row><entry>QUECHUA</entry><entry>QU</entry><entry>AMERINDIAN</entry></row>
+
+<row><entry>RHAETO-ROMANCE</entry><entry>RM</entry><entry>ROMANCE</entry></row>
+<row><entry>ROMANIAN</entry><entry>RO</entry><entry>ROMANCE</entry></row>
+<row><entry>RUSSIAN</entry><entry>RU</entry><entry>SLAVIC</entry></row>
+
+<row><entry>SAMOAN</entry><entry>SM</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SANGHO</entry><entry>SG</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SANSKRIT</entry><entry>SA</entry><entry>INDIAN</entry></row>
+<row><entry>SCOTS</entry><entry>GAELIC</entry><entry>GD CELTIC</entry></row>
+<row><entry>SERBIAN</entry><entry>SR</entry><entry>SLAVIC</entry></row>
+<row><entry>SERBO-CROATIAN</entry><entry>SH</entry><entry>SLAVIC</entry></row>
+<row><entry>SESOTHO</entry><entry>ST</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SETSWANA</entry><entry>TN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SHONA</entry><entry>SN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SINDHI</entry><entry>SD</entry><entry>INDIAN</entry></row>
+<row><entry>SINGHALESE</entry><entry>SI</entry><entry>INDIAN</entry></row>
+<row><entry>SISWATI</entry><entry>SS</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SLOVAK</entry><entry>SK</entry><entry>SLAVIC</entry></row>
+<row><entry>SLOVENIAN</entry><entry>SL</entry><entry>SLAVIC</entry></row>
+<row><entry>SOMALI</entry><entry>SO</entry><entry>HAMITIC</entry></row>
+<row><entry>SPANISH</entry><entry>ES</entry><entry>ROMANCE</entry></row>
+<row><entry>SUNDANESE</entry><entry>SU</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SWAHILI</entry><entry>SW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SWEDISH</entry><entry>SV</entry><entry>GERMANIC</entry></row>
+
+<row><entry>TAGALOG</entry><entry>TL</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>TAJIK</entry><entry>TG</entry><entry>IRANIAN</entry></row>
+<row><entry>TAMIL</entry><entry>TA</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>TATAR</entry><entry>TT</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TELUGU</entry><entry>TE</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>THAI</entry><entry>TH</entry><entry>ASIAN</entry></row>
+<row><entry>TIBETAN</entry><entry>BO</entry><entry>ASIAN</entry></row>
+<row><entry>TIGRINYA</entry><entry>TI</entry><entry>SEMITIC</entry></row>
+<row><entry>TONGA</entry><entry>TO</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>TSONGA</entry><entry>TS</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>TURKISH</entry><entry>TR</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TURKMEN</entry><entry>TK</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TWI</entry><entry>TW</entry><entry>NEGRO-AFRICAN</entry></row>
+
+<row><entry>UKRAINIAN</entry><entry>UK</entry><entry>SLAVIC</entry></row>
+<row><entry>URDU</entry><entry>UR</entry><entry>INDIAN</entry></row>
+<row><entry>UZBEK</entry><entry>UZ</entry><entry>TURKIC/ALTAIC</entry></row>
+
+<row><entry>VIETNAMESE</entry><entry>VI</entry><entry>ASIAN</entry></row>
+<row><entry>VOLAPUK</entry><entry>VO</entry><entry>INTERNATIONAL AUX.</entry></row>
+
+<row><entry>WELSH</entry><entry>CY</entry><entry>CELTIC</entry></row>
+<row><entry>WOLOF</entry><entry>WO</entry><entry>NEGRO-AFRICAN</entry></row>
+
+<row><entry>XHOSA</entry><entry>XH</entry><entry>NEGRO-AFRICAN</entry></row>
+
+<row><entry>YIDDISH</entry><entry>JI</entry><entry>GERMANIC</entry></row>
+<row><entry>YORUBA</entry><entry>YO</entry><entry>NEGRO-AFRICAN</entry></row>
+
+<row><entry>ZULU</entry><entry>ZU</entry><entry>NEGRO-AFRICAN</entry></row>
+</tbody>
+</tgroup>
+</table>
+
+<table><title>Sorted By Language Code</title>
+<tgroup cols=3>
+<thead><row><entry>Langauge Name</entry><entry>Code</entry><entry>Language Family</entry></row></thead>
+<tbody>
+<row><entry>AFAR</entry><entry>AA</entry><entry>HAMITIC</entry></row>
+<row><entry>ABKHAZIAN</entry><entry>AB</entry><entry>IBERO-CAUCASIAN</entry></row>
+<row><entry>AFRIKAANS</entry><entry>AF</entry><entry>GERMANIC</entry></row>
+<row><entry>AMHARIC</entry><entry>AM</entry><entry>SEMITIC</entry></row>
+<row><entry>ARABIC</entry><entry>AR</entry><entry>SEMITIC</entry></row>
+<row><entry>ASSAMESE</entry><entry>AS</entry><entry>INDIAN</entry></row>
+<row><entry>AYMARA</entry><entry>AY</entry><entry>AMERINDIAN</entry></row>
+<row><entry>AZERBAIJANI</entry><entry>AZ</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>BASHKIR</entry><entry>BA</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>BYELORUSSIAN</entry><entry>BE</entry><entry>SLAVIC</entry></row>
+<row><entry>BULGARIAN</entry><entry>BG</entry><entry>SLAVIC</entry></row>
+<row><entry>BIHARI</entry><entry>BH</entry><entry>INDIAN</entry></row>
+<row><entry>BISLAMA</entry><entry>BI</entry><entry>[not given]</entry></row>
+<row><entry>BENGALI;BANGLA</entry><entry>BN</entry><entry>INDIAN</entry></row>
+<row><entry>TIBETAN</entry><entry>BO</entry><entry>ASIAN</entry></row>
+<row><entry>BRETON</entry><entry>BR</entry><entry>CELTIC</entry></row>
+<row><entry>CATALAN</entry><entry>CA</entry><entry>ROMANCE</entry></row>
+<row><entry>CORSICAN</entry><entry>CO</entry><entry>ROMANCE</entry></row>
+<row><entry>CZECH</entry><entry>CS</entry><entry>SLAVIC</entry></row>
+<row><entry>WELSH</entry><entry>CY</entry><entry>CELTIC</entry></row>
+<row><entry>DANISH</entry><entry>DA</entry><entry>GERMANIC</entry></row>
+<row><entry>GERMAN</entry><entry>DE</entry><entry>GERMANIC</entry></row>
+<row><entry>BHUTANI</entry><entry>DZ</entry><entry>ASIAN</entry></row>
+<row><entry>GREEK</entry><entry>EL</entry><entry>LATIN/GREEK</entry></row>
+<row><entry>ENGLISH</entry><entry>EN</entry><entry>GERMANIC</entry></row>
+<row><entry>ESPERANTO</entry><entry>EO</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>SPANISH</entry><entry>ES</entry><entry>ROMANCE</entry></row>
+<row><entry>ESTONIAN</entry><entry>ET</entry><entry>FINNO-UGRIC</entry></row>
+<row><entry>BASQUE</entry><entry>EU</entry><entry>BASQUE</entry></row>
+<row><entry>PERSIAN (farsi)</entry><entry>FA</entry><entry>IRANIAN</entry></row>
+<row><entry>FINNISH</entry><entry>FI</entry><entry>FINNO-UGRIC</entry></row>
+<row><entry>FIJI</entry><entry>FJ</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>FAROESE</entry><entry>FO</entry><entry>GERMANIC</entry></row>
+<row><entry>FRENCH</entry><entry>FR</entry><entry>ROMANCE</entry></row>
+<row><entry>FRISIAN</entry><entry>FY</entry><entry>GERMANIC</entry></row>
+<row><entry>IRISH</entry><entry>GA</entry><entry>CELTIC</entry></row>
+<row><entry>SCOTS GAELIC</entry><entry>GD</entry><entry>CELTIC</entry></row>
+<row><entry>GALICIAN</entry><entry>GL</entry><entry>ROMANCE</entry></row>
+<row><entry>GUARANI</entry><entry>GN</entry><entry>AMERINDIAN</entry></row>
+<row><entry>GUJARATI</entry><entry>GU</entry><entry>INDIAN</entry></row>
+<row><entry>HAUSA</entry><entry>HA</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>HINDI</entry><entry>HI</entry><entry>INDIAN</entry></row>
+<row><entry>CROATIAN</entry><entry>HR</entry><entry>SLAVIC</entry></row>
+<row><entry>HUNGARIAN</entry><entry>HU</entry><entry>FINNO-UGRIC</entry></row>
+<row><entry>ARMENIAN</entry><entry>HY</entry><entry>INDO-EUROPEAN (OTHER)</entry></row>
+<row><entry>INTERLINGUA</entry><entry>IA</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>INTERLINGUE</entry><entry>IE</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>INUPIAK</entry><entry>IK</entry><entry>ESKIMO</entry></row>
+<row><entry>INDONESIAN</entry><entry>IN</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>ICELANDIC</entry><entry>IS</entry><entry>GERMANIC</entry></row>
+<row><entry>ITALIAN</entry><entry>IT</entry><entry>ROMANCE</entry></row>
+<row><entry>HEBREW</entry><entry>IW</entry><entry>SEMITIC</entry></row>
+<row><entry>JAPANESE</entry><entry>JA</entry><entry>ASIAN</entry></row>
+<row><entry>YIDDISH</entry><entry>JI</entry><entry>GERMANIC</entry></row>
+<row><entry>JAVANESE</entry><entry>JV</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>GEORGIAN</entry><entry>KA</entry><entry>IBERO-CAUCASIAN</entry></row>
+<row><entry>KAZAKH</entry><entry>KK</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>GREENLANDIC</entry><entry>KL</entry><entry>ESKIMO</entry></row>
+<row><entry>CAMBODIAN</entry><entry>KM</entry><entry>ASIAN</entry></row>
+<row><entry>KANNADA</entry><entry>KN</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>KOREAN</entry><entry>KO</entry><entry>ASIAN</entry></row>
+<row><entry>KASHMIRI</entry><entry>KS</entry><entry>INDIAN</entry></row>
+<row><entry>KURDISH</entry><entry>KU</entry><entry>IRANIAN</entry></row>
+<row><entry>KIRGHIZ</entry><entry>KY</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>LATIN</entry><entry>LA</entry><entry>LATIN/GREEK</entry></row>
+<row><entry>LINGALA</entry><entry>LN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>LAOTHIAN</entry><entry>LO</entry><entry>ASIAN</entry></row>
+<row><entry>LITHUANIAN</entry><entry>LT</entry><entry>BALTIC</entry></row>
+<row><entry>LATVIAN;LETTISH</entry><entry>LV</entry><entry>BALTIC</entry></row>
+<row><entry>MALAGASY</entry><entry>MG</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MAORI</entry><entry>MI</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MACEDONIAN</entry><entry>MK</entry><entry>SLAVIC</entry></row>
+<row><entry>MALAYALAM</entry><entry>ML</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>MONGOLIAN</entry><entry>MN</entry><entry>[not given]</entry></row>
+<row><entry>MOLDAVIAN</entry><entry>MO</entry><entry>ROMANCE</entry></row>
+<row><entry>MARATHI</entry><entry>MR</entry><entry>INDIAN</entry></row>
+<row><entry>MALAY</entry><entry>MS</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MALTESE</entry><entry>MT</entry><entry>SEMITIC</entry></row>
+<row><entry>BURMESE</entry><entry>MY</entry><entry>ASIAN</entry></row>
+<row><entry>NAURU</entry><entry>NA</entry><entry>[not given]</entry></row>
+<row><entry>NEPALI</entry><entry>NE</entry><entry>INDIAN</entry></row>
+<row><entry>DUTCH</entry><entry>NL</entry><entry>GERMANIC</entry></row>
+<row><entry>NORWEGIAN</entry><entry>NO</entry><entry>GERMANIC</entry></row>
+<row><entry>OCCITAN</entry><entry>OC</entry><entry>ROMANCE</entry></row>
+<row><entry>AFAN (OROMO)</entry><entry>OM</entry><entry>HAMITIC</entry></row>
+<row><entry>ORIYA</entry><entry>OR</entry><entry>INDIAN</entry></row>
+<row><entry>PUNJABI</entry><entry>PA</entry><entry>INDIAN</entry></row>
+<row><entry>POLISH</entry><entry>PL</entry><entry>SLAVIC</entry></row>
+<row><entry>PASHTO;PUSHTO</entry><entry>PS</entry><entry>IRANIAN</entry></row>
+<row><entry>PORTUGUESE</entry><entry>PT</entry><entry>ROMANCE</entry></row>
+<row><entry>QUECHUA</entry><entry>QU</entry><entry>AMERINDIAN</entry></row>
+<row><entry>RHAETO-ROMANCE</entry><entry>RM</entry><entry>ROMANCE</entry></row>
+<row><entry>KURUNDI</entry><entry>RN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>ROMANIAN</entry><entry>RO</entry><entry>ROMANCE</entry></row>
+<row><entry>RUSSIAN</entry><entry>RU</entry><entry>SLAVIC</entry></row>
+<row><entry>KINYARWANDA</entry><entry>RW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SANSKRIT</entry><entry>SA</entry><entry>INDIAN</entry></row>
+<row><entry>SINDHI</entry><entry>SD</entry><entry>INDIAN</entry></row>
+<row><entry>SANGHO</entry><entry>SG</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SERBO-CROATIAN</entry><entry>SH</entry><entry>SLAVIC</entry></row>
+<row><entry>SINGHALESE</entry><entry>SI</entry><entry>INDIAN</entry></row>
+<row><entry>SLOVAK</entry><entry>SK</entry><entry>SLAVIC</entry></row>
+<row><entry>SLOVENIAN</entry><entry>SL</entry><entry>SLAVIC</entry></row>
+<row><entry>SAMOAN</entry><entry>SM</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SHONA</entry><entry>SN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SOMALI</entry><entry>SO</entry><entry>HAMITIC</entry></row>
+<row><entry>ALBANIAN</entry><entry>SQ</entry><entry>INDO-EUROPEAN (OTHER)</entry></row>
+<row><entry>SERBIAN</entry><entry>SR</entry><entry>SLAVIC</entry></row>
+<row><entry>SISWATI</entry><entry>SS</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SESOTHO</entry><entry>ST</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SUNDANESE</entry><entry>SU</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SWEDISH</entry><entry>SV</entry><entry>GERMANIC</entry></row>
+<row><entry>SWAHILI</entry><entry>SW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>TAMIL</entry><entry>TA</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>TELUGU</entry><entry>TE</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>TAJIK</entry><entry>TG</entry><entry>IRANIAN</entry></row>
+<row><entry>THAI</entry><entry>TH</entry><entry>ASIAN</entry></row>
+<row><entry>TIGRINYA</entry><entry>TI</entry><entry>SEMITIC</entry></row>
+<row><entry>TURKMEN</entry><entry>TK</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TAGALOG</entry><entry>TL</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SETSWANA</entry><entry>TN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>TONGA</entry><entry>TO</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>TURKISH</entry><entry>TR</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TSONGA</entry><entry>TS</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>TATAR</entry><entry>TT</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TWI</entry><entry>TW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>UKRAINIAN</entry><entry>UK</entry><entry>SLAVIC</entry></row>
+<row><entry>URDU</entry><entry>UR</entry><entry>INDIAN</entry></row>
+<row><entry>UZBEK</entry><entry>UZ</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>VIETNAMESE</entry><entry>VI</entry><entry>ASIAN</entry></row>
+<row><entry>VOLAPUK</entry><entry>VO</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>WOLOF</entry><entry>WO</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>XHOSA</entry><entry>XH</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>YORUBA</entry><entry>YO</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>CHINESE</entry><entry>ZH</entry><entry>ASIAN</entry></row>
+<row><entry>ZULU</entry><entry>ZU</entry><entry>NEGRO-AFRICAN</entry></row>
+</tbody>
+</tgroup>
+</table>
+
+<table><title>Sorted By Language Group</title>
+<tgroup cols=3>
+<thead><row><entry>Langauge Name</entry><entry>Code</entry><entry>Language Family</entry></row></thead>
+<tbody>
+<row><entry>AYMARA</entry><entry>AY</entry><entry>AMERINDIAN</entry></row>
+<row><entry>GUARANI</entry><entry>GN</entry><entry>AMERINDIAN</entry></row>
+<row><entry>QUECHUA</entry><entry>QU</entry><entry>AMERINDIAN</entry></row>
+
+<row><entry>BHUTANI</entry><entry>DZ</entry><entry>ASIAN</entry></row>
+<row><entry>BURMESE</entry><entry>MY</entry><entry>ASIAN</entry></row>
+<row><entry>CAMBODIAN</entry><entry>KM</entry><entry>ASIAN</entry></row>
+<row><entry>CHINESE</entry><entry>ZH</entry><entry>ASIAN</entry></row>
+<row><entry>JAPANESE</entry><entry>JA</entry><entry>ASIAN</entry></row>
+<row><entry>KOREAN</entry><entry>KO</entry><entry>ASIAN</entry></row>
+<row><entry>LAOTHIAN</entry><entry>LO</entry><entry>ASIAN</entry></row>
+<row><entry>THAI</entry><entry>TH</entry><entry>ASIAN</entry></row>
+<row><entry>TIBETAN</entry><entry>BO</entry><entry>ASIAN</entry></row>
+<row><entry>VIETNAMESE</entry><entry>VI</entry><entry>ASIAN</entry></row>
+
+<row><entry>LATVIAN;LETTISH</entry><entry>LV</entry><entry>BALTIC</entry></row>
+<row><entry>LITHUANIAN</entry><entry>LT</entry><entry>BALTIC</entry></row>
+
+<row><entry>BASQUE</entry><entry>EU</entry><entry>BASQUE</entry></row>
+
+<row><entry>BRETON</entry><entry>BR</entry><entry>CELTIC</entry></row>
+<row><entry>IRISH</entry><entry>GA</entry><entry>CELTIC</entry></row>
+<row><entry>SCOTS GAELIC</entry><entry>GD</entry><entry>CELTIC</entry></row>
+<row><entry>WELSH</entry><entry>CY</entry><entry>CELTIC</entry></row>
+
+<row><entry>KANNADA</entry><entry>KN</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>MALAYALAM</entry><entry>ML</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>TAMIL</entry><entry>TA</entry><entry>DRAVIDIAN</entry></row>
+<row><entry>TELUGU</entry><entry>TE</entry><entry>DRAVIDIAN</entry></row>
+
+<row><entry>GREENLANDIC</entry><entry>KL</entry><entry>ESKIMO</entry></row>
+<row><entry>INUPIAK</entry><entry>IK</entry><entry>ESKIMO</entry></row>
+
+<row><entry>ESTONIAN</entry><entry>ET</entry><entry>FINNO-UGRIC</entry></row>
+<row><entry>FINNISH</entry><entry>FI</entry><entry>FINNO-UGRIC</entry></row>
+<row><entry>HUNGARIAN</entry><entry>HU</entry><entry>FINNO-UGRIC</entry></row>
+
+<row><entry>AFRIKAANS</entry><entry>AF</entry><entry>GERMANIC</entry></row>
+<row><entry>DANISH</entry><entry>DA</entry><entry>GERMANIC</entry></row>
+<row><entry>DUTCH</entry><entry>NL</entry><entry>GERMANIC</entry></row>
+<row><entry>ENGLISH</entry><entry>EN</entry><entry>GERMANIC</entry></row>
+<row><entry>FAROESE</entry><entry>FO</entry><entry>GERMANIC</entry></row>
+<row><entry>FRISIAN</entry><entry>FY</entry><entry>GERMANIC</entry></row>
+<row><entry>GERMAN</entry><entry>DE</entry><entry>GERMANIC</entry></row>
+<row><entry>ICELANDIC</entry><entry>IS</entry><entry>GERMANIC</entry></row>
+<row><entry>NORWEGIAN</entry><entry>NO</entry><entry>GERMANIC</entry></row>
+<row><entry>SWEDISH</entry><entry>SV</entry><entry>GERMANIC</entry></row>
+<row><entry>YIDDISH</entry><entry>JI</entry><entry>GERMANIC</entry></row>
+
+<row><entry>AFAN (OROMO)</entry><entry>OM</entry><entry>HAMITIC</entry></row>
+<row><entry>AFAR</entry><entry>AA</entry><entry>HAMITIC</entry></row>
+<row><entry>SOMALI</entry><entry>SO</entry><entry>HAMITIC</entry></row>
+
+<row><entry>ABKHAZIAN</entry><entry>AB</entry><entry>IBERO-CAUCASIAN</entry></row>
+<row><entry>GEORGIAN</entry><entry>KA</entry><entry>IBERO-CAUCASIAN</entry></row>
+
+<row><entry>ASSAMESE</entry><entry>AS</entry><entry>INDIAN</entry></row>
+<row><entry>BENGALI;BANGLA</entry><entry>BN</entry><entry>INDIAN</entry></row>
+<row><entry>BIHARI</entry><entry>BH</entry><entry>INDIAN</entry></row>
+<row><entry>GUJARATI</entry><entry>GU</entry><entry>INDIAN</entry></row>
+<row><entry>HINDI</entry><entry>HI</entry><entry>INDIAN</entry></row>
+<row><entry>KASHMIRI</entry><entry>KS</entry><entry>INDIAN</entry></row>
+<row><entry>MARATHI</entry><entry>MR</entry><entry>INDIAN</entry></row>
+<row><entry>NEPALI</entry><entry>NE</entry><entry>INDIAN</entry></row>
+<row><entry>ORIYA</entry><entry>OR</entry><entry>INDIAN</entry></row>
+<row><entry>PUNJABI</entry><entry>PA</entry><entry>INDIAN</entry></row>
+<row><entry>SANSKRIT</entry><entry>SA</entry><entry>INDIAN</entry></row>
+<row><entry>SINDHI</entry><entry>SD</entry><entry>INDIAN</entry></row>
+<row><entry>SINGHALESE</entry><entry>SI</entry><entry>INDIAN</entry></row>
+<row><entry>URDU</entry><entry>UR</entry><entry>INDIAN</entry></row>
+
+<row><entry>ALBANIAN</entry><entry>SQ</entry><entry>INDO-EUROPEAN (OTHER)</entry></row>
+<row><entry>ARMENIAN</entry><entry>HY</entry><entry>INDO-EUROPEAN (OTHER)</entry></row>
+
+<row><entry>ESPERANTO</entry><entry>EO</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>INTERLINGUA</entry><entry>IA</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>INTERLINGUE</entry><entry>IE</entry><entry>INTERNATIONAL AUX.</entry></row>
+<row><entry>VOLAPUK</entry><entry>VO</entry><entry>INTERNATIONAL AUX.</entry></row>
+
+<row><entry>KURDISH</entry><entry>KU</entry><entry>IRANIAN</entry></row>
+<row><entry>PASHTO;PUSHTO</entry><entry>PS</entry><entry>IRANIAN</entry></row>
+<row><entry>PERSIAN (farsi)</entry><entry>FA</entry><entry>IRANIAN</entry></row>
+<row><entry>TAJIK</entry><entry>TG</entry><entry>IRANIAN</entry></row>
+
+<row><entry>GREEK</entry><entry>EL</entry><entry>LATIN/GREEK</entry></row>
+<row><entry>LATIN</entry><entry>LA</entry><entry>LATIN/GREEK</entry></row>
+
+<row><entry>HAUSA</entry><entry>HA</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>KINYARWANDA</entry><entry>RW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>KURUNDI</entry><entry>RN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>LINGALA</entry><entry>LN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SANGHO</entry><entry>SG</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SESOTHO</entry><entry>ST</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SETSWANA</entry><entry>TN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SHONA</entry><entry>SN</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SISWATI</entry><entry>SS</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>SWAHILI</entry><entry>SW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>TSONGA</entry><entry>TS</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>TWI</entry><entry>TW</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>WOLOF</entry><entry>WO</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>XHOSA</entry><entry>XH</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>YORUBA</entry><entry>YO</entry><entry>NEGRO-AFRICAN</entry></row>
+<row><entry>ZULU</entry><entry>ZU</entry><entry>NEGRO-AFRICAN</entry></row>
+
+<row><entry>FIJI</entry><entry>FJ</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>INDONESIAN</entry><entry>IN</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>JAVANESE</entry><entry>JV</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MALAGASY</entry><entry>MG</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MALAY</entry><entry>MS</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>MAORI</entry><entry>MI</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SAMOAN</entry><entry>SM</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>SUNDANESE</entry><entry>SU</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>TAGALOG</entry><entry>TL</entry><entry>OCEANIC/INDONESIAN</entry></row>
+<row><entry>TONGA</entry><entry>TO</entry><entry>OCEANIC/INDONESIAN</entry></row>
+
+<row><entry>CATALAN</entry><entry>CA</entry><entry>ROMANCE</entry></row>
+<row><entry>CORSICAN</entry><entry>CO</entry><entry>ROMANCE</entry></row>
+<row><entry>FRENCH</entry><entry>FR</entry><entry>ROMANCE</entry></row>
+<row><entry>GALICIAN</entry><entry>GL</entry><entry>ROMANCE</entry></row>
+<row><entry>ITALIAN</entry><entry>IT</entry><entry>ROMANCE</entry></row>
+<row><entry>MOLDAVIAN</entry><entry>MO</entry><entry>ROMANCE</entry></row>
+<row><entry>OCCITAN</entry><entry>OC</entry><entry>ROMANCE</entry></row>
+<row><entry>PORTUGUESE</entry><entry>PT</entry><entry>ROMANCE</entry></row>
+<row><entry>RHAETO-ROMANCE</entry><entry>RM</entry><entry>ROMANCE</entry></row>
+<row><entry>ROMANIAN</entry><entry>RO</entry><entry>ROMANCE</entry></row>
+<row><entry>SPANISH</entry><entry>ES</entry><entry>ROMANCE</entry></row>
+
+<row><entry>AMHARIC</entry><entry>AM</entry><entry>SEMITIC</entry></row>
+<row><entry>ARABIC</entry><entry>AR</entry><entry>SEMITIC</entry></row>
+<row><entry>HEBREW</entry><entry>IW</entry><entry>SEMITIC</entry></row>
+<row><entry>MALTESE</entry><entry>MT</entry><entry>SEMITIC</entry></row>
+<row><entry>TIGRINYA</entry><entry>TI</entry><entry>SEMITIC</entry></row>
+
+<row><entry>BULGARIAN</entry><entry>BG</entry><entry>SLAVIC</entry></row>
+<row><entry>BYELORUSSIAN</entry><entry>BE</entry><entry>SLAVIC</entry></row>
+<row><entry>CROATIAN</entry><entry>HR</entry><entry>SLAVIC</entry></row>
+<row><entry>CZECH</entry><entry>CS</entry><entry>SLAVIC</entry></row>
+<row><entry>MACEDONIAN</entry><entry>MK</entry><entry>SLAVIC</entry></row>
+<row><entry>POLISH</entry><entry>PL</entry><entry>SLAVIC</entry></row>
+<row><entry>RUSSIAN</entry><entry>RU</entry><entry>SLAVIC</entry></row>
+<row><entry>SERBIAN</entry><entry>SR</entry><entry>SLAVIC</entry></row>
+<row><entry>SERBO-CROATIAN</entry><entry>SH</entry><entry>SLAVIC</entry></row>
+<row><entry>SLOVAK</entry><entry>SK</entry><entry>SLAVIC</entry></row>
+<row><entry>SLOVENIAN</entry><entry>SL</entry><entry>SLAVIC</entry></row>
+<row><entry>UKRAINIAN</entry><entry>UK</entry><entry>SLAVIC</entry></row>
+
+<row><entry>AZERBAIJANI</entry><entry>AZ</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>BASHKIR</entry><entry>BA</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>KAZAKH</entry><entry>KK</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>KIRGHIZ</entry><entry>KY</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TATAR</entry><entry>TT</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TURKISH</entry><entry>TR</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>TURKMEN</entry><entry>TK</entry><entry>TURKIC/ALTAIC</entry></row>
+<row><entry>UZBEK</entry><entry>UZ</entry><entry>TURKIC/ALTAIC</entry></row>
+
+<row><entry>BISLAMA</entry><entry>BI</entry><entry>[not given]</entry></row>
+<row><entry>MONGOLIAN</entry><entry>MN</entry><entry>[not given]</entry></row>
+<row><entry>NAURU</entry><entry>NA</entry><entry>[not given]</entry></row>
+</tbody>
+</tgroup>
+</table>
+
+</appendix>
14 doc/root.sgml
@@ -0,0 +1,14 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
+<!ENTITY examples SYSTEM "examples.sgml">
+<!ENTITY iso639 SYSTEM "iso639.sgml">
+<!ENTITY dvdauthor SYSTEM "dvdauthor.sgml">
+<!ENTITY spumux SYSTEM "spumux.sgml">
+]>
+<book id="index"><title>DVDAuthor</title>
+&examples;
+&iso639;
+<reference id="manpages"><title>DVDAuthor Man Pages</title>
+&dvdauthor;
+&spumux;
+</reference>
+</book>
241 doc/spumux.sgml
@@ -0,0 +1,241 @@
+<refentry id="spumux">
+
+<refmeta>
+<refentrytitle>spumux</refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname>spumux</refname>
+<refpurpose>generates and multiplexes subtitles into an existing mpeg2 program stream</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>spumux</command>
+<group>
+<arg>-m dvd</arg>
+<arg>-m cvd</arg>
+<arg>-m svcd</arg>
+</group>
+<arg>-s <replaceable>stream</replaceable></arg>
+<arg>-v <replaceable>level</replaceable></arg>
+<arg>-P</arg>
+<arg choice="req"><replaceable>file</replaceable></arg>
+<arg choice="req">&lt <replaceable>mpeg</replaceable></arg>
+<arg choice="req">&gt <replaceable>mpeg-with-subtitles</replaceable></arg>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1><title>Description</title>
+<para>
+<command>spumux</command> encodes the subtitles and multiplexes it into the mpeg2 program stream.
+</para>
+<glosslist>
+<glossentry><glossterm>-m <replaceable>mode</replaceable></glossterm>
+<glossdef><para>
+
+Sets the encoding for the subtitles. Can be dvd, cvd, or svcd.
+Default is dvd.
+
+</para></glossdef></glossentry>
+<glossentry><glossterm>-s <replaceable>stream</replaceable></glossterm>
+<glossdef><para>
+Sets the subtitle stream id. Default is 0.
+</para></glossdef></glossentry>
+<glossentry><glossterm>-v <replaceable>level</replaceable></glossterm>