%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.

\section{Format Stream}

%FIXME - add basic stream overview here

\clearpage

\subsection{Header}
\begin{figure}[h]
  \includegraphics{tta/figures/header.pdf}
\end{figure}
\par
\noindent
All fields are unsigned integers.

\subsubsection{File Header Example}
\begin{figure}[h]
  \includegraphics{tta/figures/header-example.pdf}
\end{figure}
\begin{table}[h]
  \begin{tabular}{rcl}
    \textsf{signature} & : & \texttt{TTA1} \\
    \textsf{format} & : & 1 \\
    \textsf{channels} & : & 2 \\
    \textsf{bits per sample} & : & 16 \\
    \textsf{sample rate} & : & 44100 Hz \\
    \textsf{total PCM frames} & : & 10 \\
    \textsf{header CRC32} & : & \texttt{0x2033994F} \\
  \end{tabular}
\end{table}

\clearpage

\subsection{Seektable}
\begin{figure}[h]
  \includegraphics{tta/figures/seektable.pdf}
\end{figure}
\par
\noindent
There is one unsigned seekpoint value per TTA frame
and each seekpoint value is the total size of that frame in bytes.
The total number of TTA frames in a file is:
\begin{align*}
\textsf{TTA frame count} &= \left\lceil\frac{\textsf{total PCM frames} \times 245}{\textsf{sample rate} \times 256}\right\rceil
\intertext{and the size of each frame is:}
\textsf{PCM frames per TTA frame} &= \left\lfloor\frac{\textsf{sample rate} \times 256}{245}\right\rfloor
\intertext{except for the last TTA frame, which uses the remainder.}
\end{align*}
\subsubsection{Seektable Example}
Given a PCM frame count of 10 and a sample rate of 44100:
\begin{equation*}
\textsf{TTA frame count} = \left\lceil\frac{10 \times 245}{44100 \times 256}\right\rceil = 1
\end{equation*}
\begin{figure}[h]
  \includegraphics{tta/figures/seektable-example.pdf}
\end{figure}
\begin{table}[h]
  \begin{tabular}{rcl}
    $\textsf{frame size}_0$ & : & 33 bytes \\
    \textsf{seektable CRC32} & : & \texttt{0x39CA1747} \\
  \end{tabular}
\end{table}
\par
\noindent
Which indicates this file contains a single 33 byte TTA frame.

\clearpage

\subsection{CRC32 Calculation}
\label{tta:crc32}
The header, seektable and each TTA frame is followed
by a CRC32 with a checksum of the chunk's data.
For each byte $b$ in the chunk, not including the 4 checksum bytes,
the checksum is calculated as:
\begin{equation*}
\textsf{checksum}_i = \texttt{CRC32}[(\textsf{checksum}_{i - 1} \xor b) \bmod 256] \xor \lfloor\textsf{checksum}_{i - 1} \div 2 ^ 8\rfloor
\end{equation*}
\par
\noindent
where $\textsf{checksum}_{-1} = \texttt{0xFFFFFFFF}$ and
\texttt{CRC32} is taken from the following table:
\begin{table}[h]
{\relsize{-3}\ttfamily
\begin{tabular}{|r||r|r|r|r|r|r|r|r|}
\hline
 & 0x?0 & 0x?1 & 0x?2 & 0x?3 & 0x?4 & 0x?5 & 0x?6 & 0x?7 \\
\hline
0x0? &
0x00000000 &  0x77073096 &  0xEE0E612C &  0x990951BA &  0x076DC419 &  0x706AF48F &  0xE963A535 &  0x9E6495A3 \\
0x1? &
0x1DB71064 &  0x6AB020F2 &  0xF3B97148 &  0x84BE41DE &  0x1ADAD47D &  0x6DDDE4EB &  0xF4D4B551 &  0x83D385C7 \\
0x2? &
0x3B6E20C8 &  0x4C69105E &  0xD56041E4 &  0xA2677172 &  0x3C03E4D1 &  0x4B04D447 &  0xD20D85FD &  0xA50AB56B \\
0x3? &
0x26D930AC &  0x51DE003A &  0xC8D75180 &  0xBFD06116 &  0x21B4F4B5 &  0x56B3C423 &  0xCFBA9599 &  0xB8BDA50F \\
0x4? &
0x76DC4190 &  0x01DB7106 &  0x98D220BC &  0xEFD5102A &  0x71B18589 &  0x06B6B51F &  0x9FBFE4A5 &  0xE8B8D433 \\
0x5? &
0x6B6B51F4 &  0x1C6C6162 &  0x856530D8 &  0xF262004E &  0x6C0695ED &  0x1B01A57B &  0x8208F4C1 &  0xF50FC457 \\
0x6? &
0x4DB26158 &  0x3AB551CE &  0xA3BC0074 &  0xD4BB30E2 &  0x4ADFA541 &  0x3DD895D7 &  0xA4D1C46D &  0xD3D6F4FB \\
0x7? &
0x5005713C &  0x270241AA &  0xBE0B1010 &  0xC90C2086 &  0x5768B525 &  0x206F85B3 &  0xB966D409 &  0xCE61E49F \\
0x8? &
0xEDB88320 &  0x9ABFB3B6 &  0x03B6E20C &  0x74B1D29A &  0xEAD54739 &  0x9DD277AF &  0x04DB2615 &  0x73DC1683 \\
0x9? &
0xF00F9344 &  0x8708A3D2 &  0x1E01F268 &  0x6906C2FE &  0xF762575D &  0x806567CB &  0x196C3671 &  0x6E6B06E7 \\
0xA? &
0xD6D6A3E8 &  0xA1D1937E &  0x38D8C2C4 &  0x4FDFF252 &  0xD1BB67F1 &  0xA6BC5767 &  0x3FB506DD &  0x48B2364B \\
0xB? &
0xCB61B38C &  0xBC66831A &  0x256FD2A0 &  0x5268E236 &  0xCC0C7795 &  0xBB0B4703 &  0x220216B9 &  0x5505262F \\
0xC? &
0x9B64C2B0 &  0xEC63F226 &  0x756AA39C &  0x026D930A &  0x9C0906A9 &  0xEB0E363F &  0x72076785 &  0x05005713 \\
0xD? &
0x86D3D2D4 &  0xF1D4E242 &  0x68DDB3F8 &  0x1FDA836E &  0x81BE16CD &  0xF6B9265B &  0x6FB077E1 &  0x18B74777 \\
0xE? &
0xA00AE278 &  0xD70DD2EE &  0x4E048354 &  0x3903B3C2 &  0xA7672661 &  0xD06016F7 &  0x4969474D &  0x3E6E77DB \\
0xF? &
0xBDBDF21C &  0xCABAC28A &  0x53B39330 &  0x24B4A3A6 &  0xBAD03605 &  0xCDD70693 &  0x54DE5729 &  0x23D967BF \\
\hline
\hline
 & 0x?8 & 0x?9 & 0x?A & 0x?B & 0x?C & 0x?D & 0x?E & 0x?F \\
\hline
0x0? &
0x0EDB8832 &  0x79DCB8A4 &  0xE0D5E91E &  0x97D2D988 &  0x09B64C2B &  0x7EB17CBD &  0xE7B82D07 &  0x90BF1D91 \\
0x1? &
0x136C9856 &  0x646BA8C0 &  0xFD62F97A &  0x8A65C9EC &  0x14015C4F &  0x63066CD9 &  0xFA0F3D63 &  0x8D080DF5 \\
0x2? &
0x35B5A8FA &  0x42B2986C &  0xDBBBC9D6 &  0xACBCF940 &  0x32D86CE3 &  0x45DF5C75 &  0xDCD60DCF &  0xABD13D59 \\
0x3? &
0x2802B89E &  0x5F058808 &  0xC60CD9B2 &  0xB10BE924 &  0x2F6F7C87 &  0x58684C11 &  0xC1611DAB &  0xB6662D3D \\
0x4? &
0x7807C9A2 &  0x0F00F934 &  0x9609A88E &  0xE10E9818 &  0x7F6A0DBB &  0x086D3D2D &  0x91646C97 &  0xE6635C01 \\
0x5? &
0x65B0D9C6 &  0x12B7E950 &  0x8BBEB8EA &  0xFCB9887C &  0x62DD1DDF &  0x15DA2D49 &  0x8CD37CF3 &  0xFBD44C65 \\
0x6? &
0x4369E96A &  0x346ED9FC &  0xAD678846 &  0xDA60B8D0 &  0x44042D73 &  0x33031DE5 &  0xAA0A4C5F &  0xDD0D7CC9 \\
0x7? &
0x5EDEF90E &  0x29D9C998 &  0xB0D09822 &  0xC7D7A8B4 &  0x59B33D17 &  0x2EB40D81 &  0xB7BD5C3B &  0xC0BA6CAD \\
0x8? &
0xE3630B12 &  0x94643B84 &  0x0D6D6A3E &  0x7A6A5AA8 &  0xE40ECF0B &  0x9309FF9D &  0x0A00AE27 &  0x7D079EB1 \\
0x9? &
0xFED41B76 &  0x89D32BE0 &  0x10DA7A5A &  0x67DD4ACC &  0xF9B9DF6F &  0x8EBEEFF9 &  0x17B7BE43 &  0x60B08ED5 \\
0xA? &
0xD80D2BDA &  0xAF0A1B4C &  0x36034AF6 &  0x41047A60 &  0xDF60EFC3 &  0xA867DF55 &  0x316E8EEF &  0x4669BE79 \\
0xB? &
0xC5BA3BBE &  0xB2BD0B28 &  0x2BB45A92 &  0x5CB36A04 &  0xC2D7FFA7 &  0xB5D0CF31 &  0x2CD99E8B &  0x5BDEAE1D \\
0xC? &
0x95BF4A82 &  0xE2B87A14 &  0x7BB12BAE &  0x0CB61B38 &  0x92D28E9B &  0xE5D5BE0D &  0x7CDCEFB7 &  0x0BDBDF21 \\
0xD? &
0x88085AE6 &  0xFF0F6A70 &  0x66063BCA &  0x11010B5C &  0x8F659EFF &  0xF862AE69 &  0x616BFFD3 &  0x166CCF45 \\
0xE? &
0xAED16A4A &  0xD9D65ADC &  0x40DF0B66 &  0x37D83BF0 &  0xA9BCAE53 &  0xDEBB9EC5 &  0x47B2CF7F &  0x30B5FFE9 \\
0xF? &
0xB3667A2E &  0xC4614AB8 &  0x5D681B02 &  0x2A6F2B94 &  0xB40BBE37 &  0xC30C8EA1 &  0x5A05DF1B &  0x2D02EF8D \\
\hline
\end{tabular}
}
\end{table}
\par
\noindent
The checksum matches if the $\textsf{checksum}_i \xor \texttt{0xFFFFFFFF}$
equals the 32 bytes at the end of the chunk.
For example, given the bytes: \texttt{[0x21, 0x00, 0x00, 0x00]}
the checksum is calculated as:
{\relsize{-1}
  \begin{align*}
    \textsf{checksum}_0 = \texttt{CRC32}[(\texttt{0xFFFFFFFF} \xor \texttt{0x21}) \bmod 256] \xor \lfloor\texttt{0xFFFFFFFF} \div 2 ^ 8\rfloor &= \texttt{0x6194002C} \\
    \textsf{checksum}_1 = \texttt{CRC32}[(\texttt{0x6194002C} \xor \texttt{0x00}) \bmod 256] \xor \lfloor\texttt{0x6194002C} \div 2 ^ 8\rfloor &= \texttt{0x32B9F8E3} \\
    \textsf{checksum}_2 = \texttt{CRC32}[(\texttt{0x32B9F8E3} \xor \texttt{0x00}) \bmod 256] \xor \lfloor\texttt{0x32B9F8E3} \div 2 ^ 8\rfloor &= \texttt{0x39310A3A} \\
    \textsf{checksum}_3 = \texttt{CRC32}[(\texttt{0x39310A3A} \xor \texttt{0x00}) \bmod 256] \xor \lfloor\texttt{0x39310A3A} \div 2 ^ 8\rfloor &= \texttt{0xC635E8B8} \\
    \texttt{0xC635E8B8} \xor \texttt{0xFFFFFFFF} &= \texttt{0x39CA1747} \\
  \end{align*}
}
\par
\noindent
which equals the 32-bit checksum at the end of the chunk,
indicating the chunk's data is correct.
