\section{theora.\-h \-File \-Reference} \label{theora_8h}\index{theora.\-h@{theora.\-h}} \-The libtheora pre-\/1.\-0 legacy \-C \-A\-P\-I. {\ttfamily \#include $<$stddef.\-h$>$}\* {\ttfamily \#include $<$ogg/ogg.\-h$>$}\* \subsection*{\-Data \-Structures} \begin{DoxyCompactItemize} \item struct {\bf yuv\-\_\-buffer} \begin{DoxyCompactList}\small\item\em \-A \-Y\-U\-V buffer for passing uncompressed frames to and from the codec. \end{DoxyCompactList}\item struct {\bf theora\-\_\-info} \begin{DoxyCompactList}\small\item\em \-Theora bitstream info. \end{DoxyCompactList}\item struct {\bf theora\-\_\-state} \begin{DoxyCompactList}\small\item\em \-Codec internal state and context. \end{DoxyCompactList}\item struct {\bf theora\-\_\-comment} \begin{DoxyCompactList}\small\item\em \-Comment header metadata. \end{DoxyCompactList}\end{DoxyCompactItemize} \subsection*{\-Defines} \begin{DoxyCompactItemize} \item \#define {\bf \-O\-C\-\_\-\-F\-A\-U\-L\-T}~-\/1 \begin{DoxyCompactList}\small\item\em \-General failure. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-E\-I\-N\-V\-A\-L}~-\/10 \begin{DoxyCompactList}\small\item\em \-Library encountered invalid internal data. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-D\-I\-S\-A\-B\-L\-E\-D}~-\/11 \begin{DoxyCompactList}\small\item\em \-Requested action is disabled. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-B\-A\-D\-H\-E\-A\-D\-E\-R}~-\/20 \begin{DoxyCompactList}\small\item\em \-Header packet was corrupt/invalid. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-N\-O\-T\-F\-O\-R\-M\-A\-T}~-\/21 \begin{DoxyCompactList}\small\item\em \-Packet is not a theora packet. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-V\-E\-R\-S\-I\-O\-N}~-\/22 \begin{DoxyCompactList}\small\item\em \-Bitstream version is not handled. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-I\-M\-P\-L}~-\/23 \begin{DoxyCompactList}\small\item\em \-Feature or action not implemented. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-B\-A\-D\-P\-A\-C\-K\-E\-T}~-\/24 \begin{DoxyCompactList}\small\item\em \-Packet is corrupt. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-N\-E\-W\-P\-A\-C\-K\-E\-T}~-\/25 \begin{DoxyCompactList}\small\item\em \-Packet is an (ignorable) unhandled extension. \end{DoxyCompactList}\item \#define {\bf \-O\-C\-\_\-\-D\-U\-P\-F\-R\-A\-M\-E}~1 \begin{DoxyCompactList}\small\item\em \-Packet is a dropped frame. \end{DoxyCompactList}\end{DoxyCompactItemize} \begin{Indent}{\bf theora\-\_\-control() codes}\par \begin{DoxyCompactItemize} \item \#define {\bf \-T\-H\-\_\-\-D\-E\-C\-C\-T\-L\-\_\-\-G\-E\-T\-\_\-\-P\-P\-L\-E\-V\-E\-L\-\_\-\-M\-A\-X}~(1) \begin{DoxyCompactList}\small\item\em \-Get the maximum post-\/processing level. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-D\-E\-C\-C\-T\-L\-\_\-\-S\-E\-T\-\_\-\-P\-P\-L\-E\-V\-E\-L}~(3) \begin{DoxyCompactList}\small\item\em \-Set the post-\/processing level. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-E\-N\-C\-C\-T\-L\-\_\-\-S\-E\-T\-\_\-\-K\-E\-Y\-F\-R\-A\-M\-E\-\_\-\-F\-R\-E\-Q\-U\-E\-N\-C\-Y\-\_\-\-F\-O\-R\-C\-E}~(4) \begin{DoxyCompactList}\small\item\em \-Sets the maximum distance between key frames. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-D\-E\-C\-C\-T\-L\-\_\-\-S\-E\-T\-\_\-\-G\-R\-A\-N\-P\-O\-S}~(5) \begin{DoxyCompactList}\small\item\em \-Set the granule position. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-E\-N\-C\-C\-T\-L\-\_\-\-S\-E\-T\-\_\-\-Q\-U\-A\-N\-T\-\_\-\-P\-A\-R\-A\-M\-S}~(2) \begin{DoxyCompactList}\small\item\em \-Sets the quantization parameters to use. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-E\-N\-C\-C\-T\-L\-\_\-\-S\-E\-T\-\_\-\-V\-P3\-\_\-\-C\-O\-M\-P\-A\-T\-I\-B\-L\-E}~(10) \begin{DoxyCompactList}\small\item\em \-Disables any encoder features that would prevent lossless transcoding back to \-V\-P3. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-E\-N\-C\-C\-T\-L\-\_\-\-G\-E\-T\-\_\-\-S\-P\-L\-E\-V\-E\-L\-\_\-\-M\-A\-X}~(12) \begin{DoxyCompactList}\small\item\em \-Gets the maximum speed level. \end{DoxyCompactList}\item \#define {\bf \-T\-H\-\_\-\-E\-N\-C\-C\-T\-L\-\_\-\-S\-E\-T\-\_\-\-S\-P\-L\-E\-V\-E\-L}~(14) \begin{DoxyCompactList}\small\item\em \-Sets the speed level. \end{DoxyCompactList}\end{DoxyCompactItemize} \end{Indent} \subsection*{\-Typedefs} \begin{DoxyCompactItemize} \item typedef struct {\bf theora\-\_\-comment} {\bf theora\-\_\-comment} \begin{DoxyCompactList}\small\item\em \-Comment header metadata. \end{DoxyCompactList}\end{DoxyCompactItemize} \subsection*{\-Enumerations} \begin{DoxyCompactItemize} \item enum {\bf theora\-\_\-colorspace} \{ {\bf \-O\-C\-\_\-\-C\-S\-\_\-\-U\-N\-S\-P\-E\-C\-I\-F\-I\-E\-D}, {\bf \-O\-C\-\_\-\-C\-S\-\_\-\-I\-T\-U\-\_\-\-R\-E\-C\-\_\-470\-M}, {\bf \-O\-C\-\_\-\-C\-S\-\_\-\-I\-T\-U\-\_\-\-R\-E\-C\-\_\-470\-B\-G}, {\bf \-O\-C\-\_\-\-C\-S\-\_\-\-N\-S\-P\-A\-C\-E\-S} \} \begin{DoxyCompactList}\small\item\em \-A \-Colorspace. \end{DoxyCompactList}\item enum {\bf theora\-\_\-pixelformat} \{ {\bf \-O\-C\-\_\-\-P\-F\-\_\-420}, {\bf \-O\-C\-\_\-\-P\-F\-\_\-\-R\-S\-V\-D}, {\bf \-O\-C\-\_\-\-P\-F\-\_\-422}, {\bf \-O\-C\-\_\-\-P\-F\-\_\-444} \} \begin{DoxyCompactList}\small\item\em \-A \-Chroma subsampling. \end{DoxyCompactList}\end{DoxyCompactItemize} \subsection*{\-Functions} \begin{DoxyCompactItemize} \item const char $\ast$ {\bf theora\-\_\-version\-\_\-string} (void) \begin{DoxyCompactList}\small\item\em \-Retrieve a human-\/readable string to identify the encoder vendor and version. \end{DoxyCompactList}\item ogg\-\_\-uint32\-\_\-t {\bf theora\-\_\-version\-\_\-number} (void) \begin{DoxyCompactList}\small\item\em \-Retrieve a 32-\/bit version number. \end{DoxyCompactList}\item int {\bf theora\-\_\-encode\-\_\-init} ({\bf theora\-\_\-state} $\ast$th, {\bf theora\-\_\-info} $\ast$ti) \begin{DoxyCompactList}\small\item\em \-Initialize the theora encoder. \end{DoxyCompactList}\item int {\bf theora\-\_\-encode\-\_\-\-Y\-U\-Vin} ({\bf theora\-\_\-state} $\ast$t, {\bf yuv\-\_\-buffer} $\ast$yuv) \begin{DoxyCompactList}\small\item\em \-Submit a \-Y\-U\-V buffer to the theora encoder. \end{DoxyCompactList}\item int {\bf theora\-\_\-encode\-\_\-packetout} ({\bf theora\-\_\-state} $\ast$t, int last\-\_\-p, ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Request the next packet of encoded video. \end{DoxyCompactList}\item int {\bf theora\-\_\-encode\-\_\-header} ({\bf theora\-\_\-state} $\ast$t, ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Request a packet containing the initial header. \end{DoxyCompactList}\item int {\bf theora\-\_\-encode\-\_\-comment} ({\bf theora\-\_\-comment} $\ast$tc, ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Request a comment header packet from provided metadata. \end{DoxyCompactList}\item int {\bf theora\-\_\-encode\-\_\-tables} ({\bf theora\-\_\-state} $\ast$t, ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Request a packet containing the codebook tables for the stream. \end{DoxyCompactList}\item int {\bf theora\-\_\-decode\-\_\-header} ({\bf theora\-\_\-info} $\ast$ci, {\bf theora\-\_\-comment} $\ast$cc, ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Decode an \-Ogg packet, with the expectation that the packet contains an initial header, comment data or codebook tables. \end{DoxyCompactList}\item int {\bf theora\-\_\-decode\-\_\-init} ({\bf theora\-\_\-state} $\ast$th, {\bf theora\-\_\-info} $\ast$c) \begin{DoxyCompactList}\small\item\em \-Initialize a \doxyref{theora\-\_\-state}{p.}{structtheora__state} handle for decoding. \end{DoxyCompactList}\item int {\bf theora\-\_\-decode\-\_\-packetin} ({\bf theora\-\_\-state} $\ast$th, ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Input a packet containing encoded data into the theora decoder. \end{DoxyCompactList}\item int {\bf theora\-\_\-decode\-\_\-\-Y\-U\-Vout} ({\bf theora\-\_\-state} $\ast$th, {\bf yuv\-\_\-buffer} $\ast$yuv) \begin{DoxyCompactList}\small\item\em \-Output the next available frame of decoded \-Y\-U\-V data. \end{DoxyCompactList}\item int {\bf theora\-\_\-packet\-\_\-isheader} (ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Report whether a theora packet is a header or not \-This function does no verification beyond checking the header flag bit so it should not be used for bitstream identification; use \doxyref{theora\-\_\-decode\-\_\-header()}{p.}{group__oldfuncs_ga02915e63c1bd733ee291f577a8b75a82} for that. \end{DoxyCompactList}\item int {\bf theora\-\_\-packet\-\_\-iskeyframe} (ogg\-\_\-packet $\ast$op) \begin{DoxyCompactList}\small\item\em \-Report whether a theora packet is a keyframe or not. \end{DoxyCompactList}\item int {\bf theora\-\_\-granule\-\_\-shift} ({\bf theora\-\_\-info} $\ast$ti) \begin{DoxyCompactList}\small\item\em \-Report the granulepos shift radix. \end{DoxyCompactList}\item ogg\-\_\-int64\-\_\-t {\bf theora\-\_\-granule\-\_\-frame} ({\bf theora\-\_\-state} $\ast$th, ogg\-\_\-int64\-\_\-t granulepos) \begin{DoxyCompactList}\small\item\em \-Convert a granulepos to an absolute frame index, starting at 0. \end{DoxyCompactList}\item double {\bf theora\-\_\-granule\-\_\-time} ({\bf theora\-\_\-state} $\ast$th, ogg\-\_\-int64\-\_\-t granulepos) \begin{DoxyCompactList}\small\item\em \-Convert a granulepos to absolute time in seconds. \end{DoxyCompactList}\item void {\bf theora\-\_\-info\-\_\-init} ({\bf theora\-\_\-info} $\ast$c) \begin{DoxyCompactList}\small\item\em \-Initialize a \doxyref{theora\-\_\-info}{p.}{structtheora__info} structure. \end{DoxyCompactList}\item void {\bf theora\-\_\-info\-\_\-clear} ({\bf theora\-\_\-info} $\ast$c) \begin{DoxyCompactList}\small\item\em \-Clear a \doxyref{theora\-\_\-info}{p.}{structtheora__info} structure. \end{DoxyCompactList}\item void {\bf theora\-\_\-clear} ({\bf theora\-\_\-state} $\ast$t) \begin{DoxyCompactList}\small\item\em \-Free all internal data associated with a \doxyref{theora\-\_\-state}{p.}{structtheora__state} handle. \end{DoxyCompactList}\item void {\bf theora\-\_\-comment\-\_\-init} ({\bf theora\-\_\-comment} $\ast$tc) \begin{DoxyCompactList}\small\item\em \-Initialize an allocated \doxyref{theora\-\_\-comment}{p.}{structtheora__comment} structure. \end{DoxyCompactList}\item void {\bf theora\-\_\-comment\-\_\-add} ({\bf theora\-\_\-comment} $\ast$tc, char $\ast$comment) \begin{DoxyCompactList}\small\item\em \-Add a comment to an initialized \doxyref{theora\-\_\-comment}{p.}{structtheora__comment} structure. \end{DoxyCompactList}\item void {\bf theora\-\_\-comment\-\_\-add\-\_\-tag} ({\bf theora\-\_\-comment} $\ast$tc, char $\ast$tag, char $\ast$value) \begin{DoxyCompactList}\small\item\em \-Add a comment to an initialized \doxyref{theora\-\_\-comment}{p.}{structtheora__comment} structure. \end{DoxyCompactList}\item char $\ast$ {\bf theora\-\_\-comment\-\_\-query} ({\bf theora\-\_\-comment} $\ast$tc, char $\ast$tag, int count) \begin{DoxyCompactList}\small\item\em \-Look up a comment value by tag. \end{DoxyCompactList}\item int {\bf theora\-\_\-comment\-\_\-query\-\_\-count} ({\bf theora\-\_\-comment} $\ast$tc, char $\ast$tag) \begin{DoxyCompactList}\small\item\em \-Look up the number of instances of a tag. \end{DoxyCompactList}\item void {\bf theora\-\_\-comment\-\_\-clear} ({\bf theora\-\_\-comment} $\ast$tc) \begin{DoxyCompactList}\small\item\em \-Clear an allocated \doxyref{theora\-\_\-comment}{p.}{structtheora__comment} struct so that it can be freed. \end{DoxyCompactList}\item int {\bf theora\-\_\-control} ({\bf theora\-\_\-state} $\ast$th, int req, void $\ast$buf, size\-\_\-t buf\-\_\-sz) \begin{DoxyCompactList}\small\item\em \-Encoder control function. \end{DoxyCompactList}\end{DoxyCompactItemize} \subsection{\-Detailed \-Description} \-The libtheora pre-\/1.\-0 legacy \-C \-A\-P\-I. \subsection{\-Introduction}\label{index_intro} \-This is the documentation for the libtheora legacy \-C \-A\-P\-I, declared in the \doxyref{theora.\-h}{p.}{theora_8h} header, which describes the old interface used before the 1.\-0 release. \-This \-A\-P\-I was widely deployed for several years and remains supported, but for new code we recommend the cleaner \-A\-P\-I declared in \doxyref{theoradec.\-h}{p.}{theoradec_8h} and \doxyref{theoraenc.\-h}{p.}{theoraenc_8h}. libtheora is the reference implementation for {\tt \-Theora}, a free video codec. \-Theora is derived from \-On2's \-V\-P3 codec with improved integration with \-Ogg multimedia formats by {\tt \-Xiph.\-Org}.\subsection{\-Overview}\label{theora_8h_overview} \-This library will both decode and encode theora packets to/from raw \-Y\-U\-V frames. \-In either case, the packets will most likely either come from or need to be embedded in an \-Ogg stream. \-Use {\tt libogg} or {\tt liboggz} to extract/package these packets.\subsection{\-Decoding Process}\label{theora_8h_decoding} \-Decoding can be separated into the following steps\-: \begin{DoxyEnumerate} \item initialise \doxyref{theora\-\_\-info}{p.}{structtheora__info} and \doxyref{theora\-\_\-comment}{p.}{structtheora__comment} structures using \doxyref{theora\-\_\-info\-\_\-init()}{p.}{group__oldfuncs_ga3091c87d48f1faba018c5956379a6d90} and \doxyref{theora\-\_\-comment\-\_\-init()}{p.}{group__oldfuncs_ga811b92785df3bdbbebb3de612d9d6ce0}\-: \begin{DoxyVerb} theora_info info; theora_comment comment; theora_info_init(&info); theora_comment_init(&comment); \end{DoxyVerb} \item retrieve header packets from \-Ogg stream (there should be 3) and decode into \doxyref{theora\-\_\-info}{p.}{structtheora__info} and \doxyref{theora\-\_\-comment}{p.}{structtheora__comment} structures using \doxyref{theora\-\_\-decode\-\_\-header()}{p.}{group__oldfuncs_ga02915e63c1bd733ee291f577a8b75a82}. \-See \doxyref{\-Identifying \-Theora \-Packets}{p.}{theora_8h_identification} for more information on identifying which packets are theora packets. \begin{DoxyVerb} int i; for (i = 0; i < 3; i++) { (get a theora packet "op" from the Ogg stream) theora_decode_header(&info, &comment, op); } \end{DoxyVerb} \item initialise the decoder based on the information retrieved into the \doxyref{theora\-\_\-info}{p.}{structtheora__info} struct by \doxyref{theora\-\_\-decode\-\_\-header()}{p.}{group__oldfuncs_ga02915e63c1bd733ee291f577a8b75a82}. \-You will need a \doxyref{theora\-\_\-state}{p.}{structtheora__state} struct. \begin{DoxyVerb} theora_state state; theora_decode_init(&state, &info); \end{DoxyVerb} \item pass in packets and retrieve decoded frames! \-See the \doxyref{yuv\-\_\-buffer}{p.}{structyuv__buffer} documentation for information on how to retrieve raw \-Y\-U\-V data. \begin{DoxyVerb} yuf_buffer buffer; while (last packet was not e_o_s) { (get a theora packet "op" from the Ogg stream) theora_decode_packetin(&state, op); theora_decode_YUVout(&state, &buffer); } \end{DoxyVerb} \end{DoxyEnumerate}\subsubsection{\-Identifying Theora Packets}\label{theora_8h_identification} \-All streams inside an \-Ogg file have a unique serial\-\_\-no attached to the stream. \-Typically, you will want to \begin{DoxyItemize} \item retrieve the serial\-\_\-no for each b\-\_\-o\-\_\-s (beginning of stream) page encountered within the \-Ogg file; \item test the first (only) packet on that page to determine if it is a theora packet; \item once you have found a theora b\-\_\-o\-\_\-s page then use the retrieved serial\-\_\-no to identify future packets belonging to the same theora stream. \end{DoxyItemize} \-Note that you {\itshape cannot\/} use \doxyref{theora\-\_\-packet\-\_\-isheader()}{p.}{group__oldfuncs_gab969f9d0407683f0e5abe73d0839a25b} to determine if a packet is a theora packet or not, as this function does not perform any checking beyond whether a header bit is present. \-Instead, use the \doxyref{theora\-\_\-decode\-\_\-header()}{p.}{group__oldfuncs_ga02915e63c1bd733ee291f577a8b75a82} function and check the return value; or examine the header bytes at the beginning of the \-Ogg page.