18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*-
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels%!TEX root = Vorbis_I_spec.tex
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% $Id$
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\section{comment field and header specification} \label{vorbis:spec:comment}
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Overview}
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe Vorbis text comment header is the second (of three) header
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspackets that begin a Vorbis bitstream. It is meant for short text
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscomments, not arbitrary metadata; arbitrary metadata belongs in a
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsseparate logical bitstream (usually an XML stream type) that provides
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsgreater structure and machine parseability.
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe comment field is meant to be used much like someone jotting a
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsquick note on the bottom of a CDR. It should be a little information to
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsremember the disc by and explain it to others; a short, to-the-point
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstext note that need not only be a couple words, but isn't going to be
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmore than a short paragraph.  The essentials, in other words, whatever
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthey turn out to be, eg:
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{quote}
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsHonest Bob and the Factory-to-Dealer-Incentives, \textit{``I'm Still
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAround''}, opening for Moxy Fr\"{u}vous, 1997.
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{quote}
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Comment encoding}
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{Structure}
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe comment header is logically a list of eight-bit-clean vectors; the
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnumber of vectors is bounded to $2^{32}-1$ and the length of each vector
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsis limited to $2^{32}-1$ bytes. The vector length is encoded; the vector
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscontents themselves are not null terminated. In addition to the vector
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslist, there is a single vector for vendor name (also 8 bit clean,
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslength encoded in 32 bits). For example, the 1.0 release of libvorbis
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsset the vendor string to ``Xiph.Org libVorbis I 20020717''.
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe vector lengths and number of vectors are stored lsb first, according
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsto the bit packing conventions of the vorbis codec. However, since data
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsin the comment header is octet-aligned, they can simply be read as
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsunaligned 32 bit little endian unsigned integers.
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe comment header is decoded as follows:
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) [vendor_length] = read an unsigned integer of 32 bits
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) [vendor_string] = read a UTF-8 vector as [vendor_length] octets
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3) [user_comment_list_length] = read an unsigned integer of 32 bits
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4) iterate [user_comment_list_length] times {
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       5) [length] = read an unsigned integer of 32 bits
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       6) this iteration's user comment = read a UTF-8 vector as [length] octets
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     }
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7) [framing_bit] = read a single bit as boolean
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  8) if ( [framing_bit] unset or end-of-packet ) then ERROR
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  9) done.
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{Content vector format}
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe comment vectors are structured similarly to a UNIX environment variable.
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThat is, comment fields consist of a field name and a corresponding value and
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslook like:
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{quote}
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscomment[0]="ARTIST=me";
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscomment[1]="TITLE=the sound of Vorbis";
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{quote}
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe field name is case-insensitive and may consist of ASCII 0x20
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthrough 0x7D, 0x3D ('=') excluded. ASCII 0x41 through 0x5A inclusive
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels(characters A-Z) is to be considered equivalent to ASCII 0x61 through
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels0x7A inclusive (characters a-z).
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe field name is immediately followed by ASCII 0x3D ('=');
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthis equals sign is used to terminate the field name.
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels0x3D is followed by 8 bit clean UTF-8 encoded value of the
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfield contents to the end of the field.
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\paragraph{Field names}
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsBelow is a proposed, minimal list of standard field names with a
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdescription of intended use.  No single or group of field names is
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmandatory; a comment header may contain one, all or none of the names
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsin this list.
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{description} %[style=nextline]
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[TITLE]
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	Track/Work name
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[VERSION]
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	The version field may be used to differentiate multiple
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsversions of the same track title in a single collection. (e.g. remix
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsinfo)
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[ALBUM]
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	The collection name to which this track belongs
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[TRACKNUMBER]
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	The track number of this piece if part of a specific larger collection or album
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[ARTIST]
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	The artist generally considered responsible for the work. In popular music this is usually the performing band or singer. For classical music it would be the composer. For an audio book it would be the author of the original text.
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[PERFORMER]
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	The artist(s) who performed the work. In classical music this would be the conductor, orchestra, soloists. In an audio book it would be the actor who did the reading. In popular music this is typically the same as the ARTIST and is omitted.
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[COPYRIGHT]
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	Copyright attribution, e.g., '2001 Nobody's Band' or '1999 Jack Moffitt'
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[LICENSE]
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	License information, eg, 'All Rights Reserved', 'Any
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsUse Permitted', a URL to a license such as a Creative Commons license
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels("www.creativecommons.org/blahblah/license.html") or the EFF Open
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAudio License ('distributed under the terms of the Open Audio
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsLicense. see http://www.eff.org/IP/Open_licenses/eff_oal.html for
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdetails'), etc.
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[ORGANIZATION]
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	Name of the organization producing the track (i.e.
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe 'record label')
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[DESCRIPTION]
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	A short text description of the contents
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[GENRE]
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	A short text indication of music genre
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[DATE]
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	Date the track was recorded
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[LOCATION]
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	Location where track was recorded
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[CONTACT]
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	Contact information for the creators or distributors of the track. This could be a URL, an email address, the physical address of the producing label.
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item[ISRC]
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	International Standard Recording Code for the
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstrack; see \href{http://www.ifpi.org/isrc/}{the ISRC
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsintro page} for more information on ISRC numbers.
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{description}
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\paragraph{Implications}
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsField names should not be 'internationalized'; this is a
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsconcession to simplicity not an attempt to exclude the majority of
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe world that doesn't speak English. Field \emph{contents},
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelshowever, use the UTF-8 character encoding to allow easy representation
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsof any language.
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsWe have the length of the entirety of the field and restrictions on
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe field name so that the field name is bounded in a known way. Thus
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswe also have the length of the field contents.
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIndividual 'vendors' may use non-standard field names within
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsreason. The proper use of comment fields should be clear through
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscontext at this point.  Abuse will be discouraged.
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThere is no vendor-specific prefix to 'nonstandard' field names.
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsVendors should make some effort to avoid arbitrarily polluting the
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscommon namespace. We will generally collect the more useful tags
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelshere to help with standardization.
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsField names are not required to be unique (occur once) within a
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscomment header.  As an example, assume a track was recorded by three
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswell know artists; the following is permissible, and encouraged:
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{quote}
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsARTIST=Dizzy Gillespie
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsARTIST=Sonny Rollins
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsARTIST=Sonny Stitt
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{quote}
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{Encoding}
1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe comment header comprises the entirety of the second bitstream
2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsheader packet.  Unlike the first bitstream header packet, it is not
2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsgenerally the only packet on the second page and may not be restricted
2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsto within the second bitstream page.  The length of the comment header
2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspacket is (practically) unbounded.  The comment header packet is not
2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsoptional; it must be present in the bitstream even if it is
2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelseffectively empty.
2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe comment header is encoded as follows (as per Ogg's standard
2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsbitstream mapping which renders least-significant-bit of the word to be
2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoded into the least significant available bit of the current
2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsbitstream octet first):
2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{enumerate}
2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item
2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  Vendor string length (32 bit unsigned quantity specifying number of octets)
2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item
2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  Vendor string ([vendor string length] octets coded from beginning of string to end of string, not null terminated)
2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item
2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  Number of comment fields (32 bit unsigned quantity specifying number of fields)
2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item
2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  Comment field 0 length (if [Number of comment fields] $>0$; 32 bit unsigned quantity specifying number of octets)
2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item
2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  Comment field 0 ([Comment field 0 length] octets coded from beginning of string to end of string, not null terminated)
2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item
2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  Comment field 1 length (if [Number of comment fields] $>1$...)...
2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{enumerate}
2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThis is actually somewhat easier to describe in code; implementation of the above can be found in \filename{vorbis/lib/info.c}, \function{_vorbis_pack_comment()} and \function{_vorbis_unpack_comment()}.
2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
241