%Copyright (C) 2007-2015  Brian Langenberger
%This work is licensed under the
%Creative Commons Attribution-Share Alike 3.0 United States License.
%To view a copy of this license, visit
%http://creativecommons.org/licenses/by-sa/3.0/us/ or send a letter to
%Creative Commons,
%171 Second Street, Suite 300,
%San Francisco, California, 94105, USA.

\chapter{M4A}
\label{m4a}
M4A is typically AAC audio in a QuickTime container stream, though
it may also contain other formats such as MPEG-1 audio.

\section{the QuickTime File Stream}
\begin{figure}[h]
\includegraphics{figures/m4a/quicktime.pdf}
\end{figure}
\par
\noindent
Unlike other chunked formats such as RIFF WAVE, QuickTime's atom chunks
may be containers for other atoms.  All of its fields are big-endian.
\subsection{a QuickTime Atom}
\begin{figure}[h]
\includegraphics{figures/m4a/atom.pdf}
\end{figure}
\VAR{Atom Type} is an ASCII string.
\VAR{Atom Length} is the length of the entire atom, including the header.
If \VAR{Atom Length} is 0, the atom continues until the end of the file.
If \VAR{Atom Length} is 1, the atom has an extended size.  This means
there is a 64-bit length field immediately after the header which is
the atom's actual size.
\begin{figure}[h]
\includegraphics{figures/m4a/atom2.pdf}
\end{figure}
\subsection{Container Atoms}
There is no flag or field to tell a QuickTime parser which
of its atoms are containers and which ones are not.
If an atom is known to be a container, one can treat its Atom Data
as a QuickTime stream and parse it in a recursive fashion.

\clearpage

\section{M4A Atoms}
\subsection{the ftyp Atom}
\begin{figure}[h]
  \includegraphics{figures/m4a/ftyp.pdf}
\end{figure}
\par
\noindent
The \VAR{major brand} and \VAR{compatible brand} fields are ASCII strings,
or NULL when compatible brand fields are exhausted.
\VAR{major brand version} is an integer.

\subsubsection{ftyp Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/ftyp-example.pdf}
\end{figure}
\par
\noindent
\begin{tabular}{rl}
  \textsf{length} & 32 bytes \\
  \textsf{name} & \texttt{ftyp} \\
  \textsf{major brand} & \texttt{"M4A "} \\
  \textsf{major brand version} & 0 \\
  $\textsf{compatible brand}_0$ & \texttt{"M4A "} \\
  $\textsf{compatible brand}_1$ & \texttt{"mp42"} \\
  $\textsf{compatible brand}_2$ & \texttt{"isom"} \\
  $\textsf{compatible brand}_3$ & NULL \\
\end{tabular}

\clearpage

\subsection{the moov Atom}
\begin{wrapfigure}[5]{r}{2in}
  \includegraphics{figures/m4a/moov-tree.pdf}
\end{wrapfigure}

\begin{figure}[h]
  \includegraphics{figures/m4a/moov.pdf}
\end{figure}
\par
\noindent
This is a container for \hyperref[atom:mvhd]{\ATOM{mvhd}},
\hyperref[atom:trak]{\ATOM{trak}} and
\hyperref[atom:udta]{\ATOM{udta}} atoms.

\clearpage

\subsection{the mvhd Atom}
\label{atom:mvhd}
\begin{figure}[h]
  \includegraphics{figures/m4a/mvhd.pdf}
\end{figure}
\par
\noindent
If \VAR{version} is 0, \VAR{created Mac UTC Date},
\VAR{modified Mac UTC Date} and
\VAR{duration} are 32-bit fields.  If it is 1, they are 64-bit fields.
The \VAR{created MAC UTC date} and \VAR{modified MAC UTC date} are seconds
since the Macintosh Epoch, which is 00:00:00, January 1st, 1904.\footnote{Why 1904?  It's the first leap year of the 20th century.}
To convert a Unix Epoch timestamp (seconds since January 1st, 1970) to
a Macintosh Epoch, one needs to add 24,107 days -
or \texttt{2082844800} seconds.
\VAR{Time scale} is the file's sample rate
and \VAR{duration} is the length of the file, in PCM frames.

\clearpage

\subsubsection{mvhd Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/mvhd-example.pdf}
\end{figure}
\par
\noindent
\begin{tabular}{rl}
  \textsf{length} & 108 bytes \\
  \textsf{name} & \texttt{mvhd} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{created Mac UTC date} & 3441086831 \\
  \textsf{modified Mac UTC date} & 3441086831 \\
  \textsf{time scale} & 44100 Hz \\
  \textsf{duration} & 304844 PCM frames \\
  \textsf{playback speed} & 65536 \\
  \textsf{user volume} & 256 \\
  \textsf{reserved} & 0 \\
  \textsf{WGM A} & 65536 \\
  \textsf{WGM B} & 0 \\
  \textsf{WGM U} & 0 \\
  \textsf{WGM C} & 0 \\
  \textsf{WGM D} & 65536 \\
  \textsf{WGM V} & 0 \\
  \textsf{WGM X} & 0 \\
  \textsf{WGM Y} & 0 \\
  \textsf{WGM W} & 1073741824 \\
  \textsf{QT preview} & 0 \\
  \textsf{QT still poster} & 0 \\
  \textsf{QT selection time} & 0 \\
  \textsf{QT current time} & 0 \\
  \textsf{next track ID} & 2 \\
\end{tabular}

\clearpage

\begin{wrapfigure}[5]{r}{1in}
  \includegraphics[width=1in,keepaspectratio]{figures/m4a/trak-tree.pdf}
\end{wrapfigure}
\subsection{the trak Atom}
\label{atom:trak}
\begin{minipage}[t]{4.75in}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/trak.pdf}
\par
\noindent
This is a container for \hyperref[atom:tkhd]{\ATOM{tkhd}} and
\hyperref[atom:mdia]{\ATOM{mdia}} atoms.
\noindent
\subsection{the tkhd Atom}
\label{atom:tkhd}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/tkhd.pdf}
\par
\noindent
As with `mvhd', if \VAR{version} is 0, \VAR{created Mac UTC Date},
\VAR{modified Mac UTC Date} and \VAR{duration} are 32-bit fields.
If it is 1, they are 64-bit fields.
\end{minipage}

\clearpage

\subsubsection{tkhd Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/tkhd-example.pdf}
\end{figure}
\par
\noindent
\begin{tabular}{rl}
  \textsf{length} & 92 bytes \\
  \textsf{name} & \texttt{tkhd} \\
  \textsf{version} & 0 \\
  \textsf{reserved} & 0 \\
  \textsf{track in poster} & 0 \\
  \textsf{track in preview} & 1 \\
  \textsf{track in movie} & 1 \\
  \textsf{track enabled} & 1 \\
  \textsf{created Mac UTC date} & 3441086831 \\
  \textsf{modified Mac UTC date} & 3441086831 \\
  \textsf{track ID} & 1 \\
  \textsf{reserved} & 0 \\
  \textsf{duration} & 304844 PCM frames \\
  \textsf{reserved} & 0 \\
  \textsf{video layer} & 0 \\
  \textsf{QT alternate} & 0 \\
  \textsf{volume} & 256 \\
  \textsf{reserved} & 0 \\
  \textsf{VGM Value A} & 65536 \\
  \textsf{VGM Value B} & 0 \\
  \textsf{VGM Value U} & 0 \\
  \textsf{VGM Value C} & 0 \\
  \textsf{VGM Value D} & 65536 \\
  \textsf{VGM Value V} & 0 \\
  \textsf{VGM Value X} & 0 \\
  \textsf{VGM Value Y} & 0 \\
  \textsf{VGM Value W} & 1073741824 \\
  \textsf{video width} & 0 \\
  \textsf{video height} & 0 \\
\end{tabular}

\clearpage

\begin{wrapfigure}[5]{r}{1in}
  \includegraphics[width=1in,keepaspectratio]{figures/m4a/mdia-tree.pdf}
\end{wrapfigure}
\begin{minipage}[t]{4.75in}
\subsection{the mdia Atom}
\label{atom:mdia}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/mdia.pdf}
\par
\noindent
This is a container for \hyperref[atom:mdhd]{\ATOM{mdhd}},
\hyperref[atom:hdlr]{\ATOM{hdlr}} and
\hyperref[atom:minf]{\ATOM{minf}} atoms.

\subsection{the mdhd Atom}
\label{atom:mdhd}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/mdhd.pdf}
\par
\noindent
The \ATOM{mdhd} atom contains track information such as samples-per-second,
track length and creation/modification times.
As with \ATOM{mvhd}, if \VAR{version} is 0, \VAR{created Mac UTC date},
\VAR{modified Mac UTC date} and \VAR{track length} are 32-bit fields.
If it is 1, they are 64-bit fields.
\VAR{language} is a set of 3, 5-bit fields which can be converted
back to ASCII by adding 96 to their values.
\end{minipage}

\clearpage

\subsubsection{mdhd Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/mdhd-example.pdf}
\end{figure}
\begin{figure}[h]
  \includegraphics{figures/m4a/mdhd-example2.pdf}
\end{figure}
\par
\noindent
\begin{tabular}{rl}
  \textsf{length} & 32 bytes \\
  \textsf{name} & \texttt{mdhd} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{create MAC UTC date} & 3441086831 \\
  \textsf{modify MAC UTC date} & 3441086831 \\
  \textsf{sample rate} & 44100 Hz \\
  \textsf{PCM frame count} & 304844 \\
  $\textsf{language}_0$ & \multicolumn{1}{r}{21 + 96 = \texttt{'u'}} \\
  $\textsf{language}_1$ & \multicolumn{1}{r}{14 + 96 = \texttt{'n'}} \\
  $\textsf{language}_2$ & \multicolumn{1}{r}{4 + 96 = \texttt{'d'}} \\
  \textsf{quality} & 0 \\
\end{tabular}
\par
\noindent
The three language fields combine to make \texttt{"und"} meaning
undefined, which is typical.

\clearpage

\subsection{the hdlr Atom}
\label{atom:hdlr}
\begin{figure}[h]
\includegraphics{figures/m4a/hdlr.pdf}
\end{figure}
\par
\noindent
\VAR{QuickTime flags}, \VAR{QuickTime flags mask} and
\VAR{component name length}
are integers.  The rest are ASCII strings.

\subsubsection{hdlr Atom Example}
\begin{figure}[h]
\includegraphics{figures/m4a/hdlr-example.pdf}
\end{figure}
\begin{tabular}{rl}
  \textsf{length} & 34 bytes \\
  \textsf{name} & \texttt{hdlr} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{QuickTime type} & NULL \\
  \textsf{subtype/media} & \textsf{"soun"} \\
  \textsf{QuickTime manufacturer} & NULL \\
  \textsf{QuickTime flags} & 0 \\
  \textsf{QuickTime flags mask} & 0 \\
  \textsf{component name length} & 0 \\
  \textsf{component name} & \textsf{""} \\
\end{tabular}

\clearpage

\begin{wrapfigure}[5]{r}{1in}
  \includegraphics[width=1in,keepaspectratio]{figures/m4a/minf-tree.pdf}
\end{wrapfigure}
\begin{minipage}[t]{4.75in}
\subsection{the minf Atom}
\label{atom:minf}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/minf.pdf}
\par
\noindent
This atom is a container for \hyperref[atom:smhd]{\ATOM{smhd}},
\hyperref[atom:dinf]{\ATOM{dinf}} and
\hyperref[atom:stbl]{\ATOM{stbl}} atoms.

\subsection{the smhd Atom}
\label{atom:smhd}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/smhd.pdf}

\subsubsection{smhd Atom Example}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/smhd-example.pdf}
\begin{tabular}{rl}
  \textsf{length} & 16 bytes \\
  \textsf{name} & \textsf{smhd} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{audio balance} & 0 \\
  \textsf{reserved} & 0 \\
\end{tabular}
\end{minipage}

\clearpage

\subsection{the dinf Atom}
\label{atom:dinf}
\begin{figure}[h]
  \includegraphics{figures/m4a/dinf.pdf}
\end{figure}
\par
\noindent
This atom is a container for the \hyperref[atom:dref]{\ATOM{dref}} atom.

\subsection{the dref Atom}
\label{atom:dref}
\begin{figure}[h]
\includegraphics{figures/m4a/dref.pdf}
\end{figure}
\par
\noindent
This atom is a container for a number of reference atoms.

\subsubsection{dref Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/dref-example.pdf}
\end{figure}
\begin{tabular}{rl}
  \textsf{length} & 28 bytes \\
  \textsf{name} & \textsf{dref} \\
  \textsf{reference atoms} & 1 \\
\end{tabular}

\clearpage

\begin{wrapfigure}[5]{r}{1in}
  \includegraphics[width=1in,keepaspectratio]{figures/m4a/stbl-tree.pdf}
\end{wrapfigure}
\begin{minipage}[t]{4.75in}
\subsection{the stbl Atom}
\label{atom:stbl}
\includegraphics[width=4.75in,keepaspectratio]{figures/m4a/stbl.pdf}
\par
\noindent
This atom is a container for the
\hyperref[atom:stsd]{\ATOM{stsd}},
\hyperref[atom:stts]{\ATOM{stts}},
\hyperref[atom:stsc]{\ATOM{stsc}},
\hyperref[atom:stsz]{\ATOM{stsz}} and
\hyperref[atom:stco]{\ATOM{stco}} atoms.
\end{minipage}


\clearpage

\subsection{the stsd Atom}
\label{atom:stsd}
\begin{figure}[h]
\includegraphics{figures/m4a/stsd.pdf}
\end{figure}
\par
\noindent
This atom typically contains a decription atom,
which contents will vary depending on the file format.
AAC audio contains a \ATOM{mp4a} description,
Apple Lossless contains an \ATOM{alac} description
and so forth.

\subsubsection{stsd Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/stsd-example.pdf}
\end{figure}
\begin{tabular}{rl}
  \textsf{length} & 88 bytes \\
  \textsf{name} & \textsf{stsd} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{number of descriptions} & 1 \\
\end{tabular}

\clearpage

%% \subsection{the mp4a Atom}

%% The \ATOM{mp4a} atom contains information such as the number of channels
%% and bits-per-sample.  It can be found in the \ATOM{stsd} atom.

%% \begin{figure}[h]
%% \includegraphics{figures/m4a/mp4a.pdf}
%% \end{figure}

%% \clearpage

\subsection{the stts Atom}
\label{atom:stts}
\begin{figure}[h]
  \includegraphics{figures/m4a/stts.pdf}
\end{figure}
\par
\noindent
This atom is for storing stream block sizes.
\subsubsection{stts Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/stts-example.pdf}
\end{figure}
\par
\noindent
\begin{tabular}{rl}
  \textsf{length} & 32 bytes \\
  \textsf{name} & \texttt{stts} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{number of times} & 2 \\
  $\textsf{frame count}_0$ & 74 \\
  $\textsf{duration}_0$ & 4096 PCM frames \\
  $\textsf{frame count}_1$ & 1 \\
  $\textsf{duration}_1$ & 1740 PCM frames \\
\end{tabular}
\par
\noindent
Which indicates the stream has 74 frames with 4096 PCM frames each,
and 1 frame with 1740 PCM frames, for a total of 304844 PCM frames
(which matches values stored elsewhere in the stream).

\clearpage

\subsection{the stsc Atom}
\label{atom:stsc}
\begin{figure}[h]
  \includegraphics{figures/m4a/stsc.pdf}
\end{figure}
\par
\noindent
This atom indicates how the file is split into seekable chunks.
\VAR{first chunk} is the index of the first chunk
which contains \VAR{frames per chunk} M4A or ALAC frames per
chunk and continues at that interval until the next index.

\subsubsection{stsc Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/stsc-example.pdf}
\end{figure}
\par
\noindent
\begin{tabular}{rl}
  \textsf{length} & 28 bytes \\
  \textsf{name} & \texttt{stsc} \\
  \textsf{number of chunks} & 1 \\
  $\textsf{first chunk}_0$ & 1 \\
  $\textsf{frames per chunk}_0$ & 5 \\
  $\textsf{sample duration index}$ & 1 \\
\end{tabular}
\par
\noindent
Which indicates that all of the file's chunks, which start from index 1,
have 5 M4A or ALAC frames.

\clearpage

\subsection{the stsz Atom}
\label{atom:stsz}
\begin{figure}[h]
  \includegraphics{figures/m4a/stsz.pdf}
\end{figure}
\par
\noindent
This atom contains a list of M4A or ALAC frame sizes,
with one size value per frame.
%% \subsubsection{stsz Atom Example}
%% \begin{figure}[h]
%%   \includegraphics{figures/m4a/stsz-example.pdf}
%% \end{figure}
%% \par
%% \noindent
%% \begin{tabular}{rl}
%%   \textsf{length} & 320 bytes \\
%%   \textsf{name} & \texttt{stsz} \\
%%   \textsf{block byte size} & 0 \\
%%   \textsf{number of frame sizes} & 75 \\
%%   $\textsf{size}_{0}$ & 3890 bytes \\
%%   $\textsf{size}_{1}$ & 3541 bytes \\
%%   $\textsf{size}_{2}$ & 3607 bytes \\
%%   $\textsf{size}_{3}$ & 3636 bytes \\
%%   $\textsf{size}_{4}$ & 3756 bytes \\
%%   $\textsf{size}_{5}$ & 3787 bytes \\
%%   $\textsf{size}_{6}$ & 4538 bytes \\
%%   $\textsf{size}_{7}$ & 5154 bytes \\
%%   $\textsf{size}_{8}$ & 5459 bytes \\
%%   $\textsf{size}_{9}$ & 5853 bytes \\
%%   $\textsf{size}_{10}$ & 6310 bytes \\
%%   $\textsf{size}_{11}$ & 6269 bytes \\
%%   $\textsf{size}_{12}$ & 5976 bytes \\
%%   $\textsf{size}_{13}$ & 5774 bytes \\
%%   $\textsf{size}_{14}$ & 5665 bytes \\
%%   $\textsf{size}_{15}$ & 5483 bytes \\
%%   $\textsf{size}_{16}$ & 5204 bytes \\
%%   $\textsf{size}_{17}$ & 4940 bytes \\
%%   $\textsf{size}_{18}$ & 4876 bytes \\
%%   $\textsf{size}_{19}$ & 4775 bytes \\
%%   $\textsf{size}_{20}$ & 4730 bytes \\
%%   $\textsf{size}_{21}$ & 4731 bytes \\
%%   $\textsf{size}_{22}$ & 4750 bytes \\
%%   $\textsf{size}_{23}$ & 4922 bytes \\
%%   $\textsf{size}_{24}$ & 4738 bytes \\
%%   $\textsf{size}_{25}$ & 5647 bytes \\
%%   $\textsf{size}_{26}$ & 6984 bytes \\
%%   $\textsf{size}_{27}$ & 7450 bytes \\
%%   $\textsf{size}_{28}$ & 7855 bytes \\
%%   $\textsf{size}_{29}$ & 8919 bytes \\
%%   $\textsf{size}_{30}$ & 9049 bytes \\
%%   $\textsf{size}_{31}$ & 8484 bytes \\
%%   $\textsf{size}_{32}$ & 6517 bytes \\
%%   $\textsf{size}_{33}$ & 6271 bytes \\
%%   $\textsf{size}_{34}$ & 6066 bytes \\
%%   $\textsf{size}_{35}$ & 5833 bytes \\
%%   $\textsf{size}_{36}$ & 5545 bytes \\
%%   $\textsf{size}_{37}$ & 5312 bytes \\
%%   $\textsf{size}_{38}$ & 5139 bytes \\
%%   $\textsf{size}_{39}$ & 5004 bytes \\
%%   $\textsf{size}_{40}$ & 4887 bytes \\
%%   $\textsf{size}_{41}$ & 4808 bytes \\
%%   $\textsf{size}_{42}$ & 4822 bytes \\
%%   $\textsf{size}_{43}$ & 7520 bytes \\
%%   $\textsf{size}_{44}$ & 8109 bytes \\
%%   $\textsf{size}_{45}$ & 9061 bytes \\
%%   $\textsf{size}_{46}$ & 9113 bytes \\
%%   $\textsf{size}_{47}$ & 9785 bytes \\
%%   $\textsf{size}_{48}$ & 9244 bytes \\
%%   $\textsf{size}_{49}$ & 8864 bytes \\
%%   $\textsf{size}_{50}$ & 8428 bytes \\
%%   $\textsf{size}_{51}$ & 8175 bytes \\
%%   $\textsf{size}_{52}$ & 7531 bytes \\
%%   $\textsf{size}_{53}$ & 7216 bytes \\
%%   $\textsf{size}_{54}$ & 7039 bytes \\
%%   $\textsf{size}_{55}$ & 6611 bytes \\
%%   $\textsf{size}_{56}$ & 6210 bytes \\
%%   $\textsf{size}_{57}$ & 5914 bytes \\
%%   $\textsf{size}_{58}$ & 5757 bytes \\
%%   $\textsf{size}_{59}$ & 5587 bytes \\
%%   $\textsf{size}_{60}$ & 5509 bytes \\
%%   $\textsf{size}_{61}$ & 5225 bytes \\
%%   $\textsf{size}_{62}$ & 5107 bytes \\
%%   $\textsf{size}_{63}$ & 4850 bytes \\
%%   $\textsf{size}_{64}$ & 4607 bytes \\
%%   $\textsf{size}_{65}$ & 4600 bytes \\
%%   $\textsf{size}_{66}$ & 4566 bytes \\
%%   $\textsf{size}_{67}$ & 4367 bytes \\
%%   $\textsf{size}_{68}$ & 4376 bytes \\
%%   $\textsf{size}_{69}$ & 4313 bytes \\
%%   $\textsf{size}_{70}$ & 4116 bytes \\
%%   $\textsf{size}_{71}$ & 4143 bytes \\
%%   $\textsf{size}_{72}$ & 3873 bytes \\
%%   $\textsf{size}_{73}$ & 4029 bytes \\
%%   $\textsf{size}_{74}$ & 1636 bytes \\
%% \end{tabular}

\clearpage

\subsection{the stco Atom}
\label{atom:stco}
\begin{figure}[h]
  \includegraphics{figures/m4a/stco.pdf}
\end{figure}
\par
\noindent
Offsets point to an absolute position in the file,
which will be the start of frames in the \ATOM{mdat} atom.
\subsubsection{stco Atom Example}
\begin{figure}[h]
  \includegraphics{figures/m4a/stco-example.pdf}
\end{figure}
\par
\noindent
{\relsize{-2}
\begin{tabular}{rl}
  \textsf{length} & 76 bytes \\
  \textsf{name} & \texttt{stco} \\
  \textsf{version} & 0 \\
  \textsf{flags} & 0 \\
  \textsf{number of offsets} & 15 \\
  $\textsf{offset}_{0}$ & \texttt{0x2000} \\
  $\textsf{offset}_{1}$ & \texttt{0x67FE} \\
  $\textsf{offset}_{2}$ & \texttt{0xC8D5} \\
  $\textsf{offset}_{3}$ & \texttt{0x13DFF} \\
  $\textsf{offset}_{4}$ & \texttt{0x1A0BD} \\
  $\textsf{offset}_{5}$ & \texttt{0x1FDFC} \\
  $\textsf{offset}_{6}$ & \texttt{0x28DF3} \\
  $\textsf{offset}_{7}$ & \texttt{0x31C16} \\
  $\textsf{offset}_{8}$ & \texttt{0x384E7} \\
  $\textsf{offset}_{9}$ & \texttt{0x3FAA9} \\
  $\textsf{offset}_{10}$ & \texttt{0x4AE9C} \\
  $\textsf{offset}_{11}$ & \texttt{0x54491} \\
  $\textsf{offset}_{12}$ & \texttt{0x5BA10} \\
  $\textsf{offset}_{13}$ & \texttt{0x61CE2} \\
  $\textsf{offset}_{14}$ & \texttt{0x673B0} \\
\end{tabular}
}

\clearpage

\subsection{the utda Atom}
\label{atom:udta}
\begin{figure}[h]
  \includegraphics{figures/m4a/udta.pdf}
\end{figure}
\par
\noindent
This atom is a container for the \hyperref[atom:meta]{\ATOM{meta}} atom.

\subsection{the meta Atom}
\label{atom:meta}
\begin{figure}[h]
  \includegraphics{figures/m4a/meta.pdf}
\end{figure}
\begin{wrapfigure}[3]{r}{1.5in}
  \includegraphics{figures/m4a/meta_atoms.pdf}
\end{wrapfigure}
\par
\noindent
This atom is a container for
\hyperref[atom:hdlr]{\ATOM{hdlr}},
\hyperref[atom:ilst]{\ATOM{ilst}} and
\hyperref[atom:free]{\ATOM{free}} atoms.
Note that unlike other containers, \ATOM{meta} has \VAR{version}
and \VAR{flags} fields prior to its sub-atoms.

\clearpage

\subsection{the ilst Atom}
\label{atom:ilst}
\begin{figure}[h]
  \includegraphics{figures/m4a/ilst.pdf}
\end{figure}
\par
\noindent
Text \ATOM{data} atoms have a \VAR{type} of 1
and their names are often prefixed by the \texttt{0xA9} byte
which indicates that the value of \VAR{metadata} is UTF-8 encoded text.
Binary data atoms typically have a \VAR{type} of 0
which indicates \VAR{metadata} is something else.
\begin{table}[h]
  \begin{tabular}{rlrl}
    \textsf{atom name} & meaning & \textsf{atom name} & meaning \\
    \hline
    \texttt{alb} & album name & \texttt{ART} & track artist \\
    \texttt{cmt} & comments & \texttt{covr} & cover image \\
    \texttt{cpil} & compilation & \texttt{cprt} & copyright \\
    \texttt{day} & year & \texttt{disk} & disc number \\
    \texttt{gnre} & genre & \texttt{grp} & grouping \\
    \texttt{----} & iTunes-specific & \texttt{nam} & track name \\
    \texttt{rtng} & rating & \texttt{tmpo} & BMP \\
    \texttt{too} & encoder & \texttt{trkn} & track number \\
    \texttt{wrt} & composer \\
  \end{tabular}
\end{table}

\clearpage

\subsubsection{the trkn Sub-Atom}
\begin{figure}[h]
\includegraphics{figures/m4a/trkn.pdf}
\end{figure}
\par
\noindent
\ATOM{trkn} is a binary sub-atom of \ATOM{ilst} which contains
the file's track number and track total.

\subsubsection{the disk Sub-Atom}
\begin{figure}[h]
\includegraphics{figures/m4a/disk.pdf}
\end{figure}
\par
\noindent
\ATOM{disk} is a binary sub-atom of \ATOM{ilst} which contains
the file's disc number and disc total.

\clearpage

\subsubsection{meta Atom Example}
\begin{figure}[h]
\includegraphics[height=6in]{figures/m4a/meta-example.pdf}
\end{figure}

\clearpage

\subsubsection{nam Atom Example}
\includegraphics{figures/m4a/nam-example.pdf}
\par
\noindent
\begin{tabular}{rl}
  \textsf{atom name} & \texttt{ nam} \\
  \textsf{type} & 1 (text) \\
  \textsf{metadata} & \texttt{"Track Name"} (UTF-8 encoded text) \\
\end{tabular}

\subsubsection{alb Atom Example}
\includegraphics{figures/m4a/alb-example.pdf}
\par
\noindent
\begin{tabular}{rl}
  \textsf{atom name} & \texttt{ alb} \\
  \textsf{type} & 1 (text) \\
  \textsf{metadata} & \texttt{"Album Name"} (UTF-8 encoded text) \\
\end{tabular}

\subsubsection{trkn Atom Example}
\includegraphics{figures/m4a/trkn-example.pdf}
\par
\noindent
\begin{tabular}{rl}
  \textsf{atom name} & \texttt{trkn} \\
  \textsf{type} & 0 (binary) \\
  \textsf{track number} : & \texttt{1} \\
  \textsf{total tracks} : & \texttt{2} \\
\end{tabular}

\subsubsection{disk Atom Example}
\includegraphics{figures/m4a/disk-example.pdf}
\par
\noindent
\begin{tabular}{rl}
  \textsf{atom name} & \texttt{disk} \\
  \textsf{type} & 0 (binary) \\
  \textsf{track number} : & \texttt{3} \\
  \textsf{total tracks} : & \texttt{4} \\
\end{tabular}

\clearpage

\subsection{the free Atom}
\label{atom:free}
\begin{figure}[h]
  \includegraphics{figures/m4a/free.pdf}
\end{figure}
\par
\noindent
This atom is a collection of NULL bytes which are easy
to resize in order to accomodate more data
in the \ATOM{meta} atom without having to change
its size and rewrite the whole file.

\subsection{the mdat Atom}
\begin{figure}[h]
  \includegraphics{figures/m4a/mdat.pdf}
\end{figure}
\par
\noindent
This atom is contains the file's audio data frames.
