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