1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libkate: encoding.c</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">libkate<span id="projectnumber"> 0.4.3</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">encoding.c</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><span class="comment">/*</span></div>
<div class="line"><span class="comment"> This shows the steps necessary to encode a Kate stream.</span></div>
<div class="line"><span class="comment"> For clarity, error checking is omitted.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#include <stdio.h></span></div>
<div class="line"><span class="preprocessor">#include <string.h></span></div>
<div class="line"><span class="preprocessor">#include <ogg/ogg.h></span></div>
<div class="line"><span class="preprocessor">#include "common.h"</span></div>
<div class="line"> </div>
<div class="line"><span class="comment">/* All the libkate API is available from the main kate header file: */</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#include <<a class="code" href="oggkate_8h.html">kate/oggkate.h</a>></span></div>
<div class="line"> </div>
<div class="line"><span class="comment">/*</span></div>
<div class="line"><span class="comment"> We want to control when Ogg pages are output, as Kate is a discontinuous</span></div>
<div class="line"><span class="comment"> codec, so we don't know when the next event will happen, hence the need</span></div>
<div class="line"><span class="comment"> to create a page for every event.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> flush_page(ogg_stream_state *os)</div>
<div class="line">{</div>
<div class="line"> ogg_page og;</div>
<div class="line"> <span class="keywordflow">while</span> (1) {</div>
<div class="line"> <span class="keywordtype">int</span> ret=ogg_stream_flush(os,&og);</div>
<div class="line"> <span class="keywordflow">if</span> (ret==0) <span class="keywordflow">break</span>;</div>
<div class="line"> fwrite(og.header,1,og.header_len,stdout);</div>
<div class="line"> fwrite(og.body,1,og.body_len,stdout);</div>
<div class="line"> }</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">int</span> main()</div>
<div class="line">{</div>
<div class="line"> <span class="comment">/* We need an Ogg stream to write to */</span></div>
<div class="line"> </div>
<div class="line"> ogg_stream_state os;</div>
<div class="line"> ogg_packet op;</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> First, a kate_info structure needs to be created and setup for the stream to create.</span></div>
<div class="line"><span class="comment"> A kate_comment structure also has to be created.</span></div>
<div class="line"><span class="comment"> Information from both of these will get encoded into the stream headers.</span></div>
<div class="line"><span class="comment"> Last, we also need a kate_state structure, which will be initialized later.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> <a id="_a0" name="_a0"></a><a class="code hl_struct" href="structkate__info.html">kate_info</a> ki;</div>
<div class="line"> <a id="_a1" name="_a1"></a><a class="code hl_struct" href="structkate__comment.html">kate_comment</a> kc;</div>
<div class="line"> <a id="_a2" name="_a2"></a><a class="code hl_struct" href="structkate__state.html">kate_state</a> k;</div>
<div class="line"> </div>
<div class="line"> <a id="a3" name="a3"></a><a class="code hl_function" href="group__info.html#gab9031b2c167954bc7d754b30774f0241">kate_info_init</a>(&ki);</div>
<div class="line"> <a id="a4" name="a4"></a><a class="code hl_function" href="group__comments.html#ga4f717746ed53e557e57bb1e2b40dbd84">kate_comment_init</a>(&kc);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> The most important part of the kate_info structure on encoding is the granule</span></div>
<div class="line"><span class="comment"> encoding information, which describes how granules and time are mapped.</span></div>
<div class="line"><span class="comment"> Here, we map one granule to one millisecond.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> ki.<a id="a5" name="a5"></a><a class="code hl_variable" href="structkate__info.html#a1bf457732577344fa6d0f035d30d1e13">granule_shift</a>=32;</div>
<div class="line"> ki.<a id="a6" name="a6"></a><a class="code hl_variable" href="structkate__info.html#a7eb196702d96e5676b27838cadfd6acf">gps_numerator</a>=1000;</div>
<div class="line"> ki.<a id="a7" name="a7"></a><a class="code hl_variable" href="structkate__info.html#a00c2253966d5a22cc3e56f4f98dd4995">gps_denominator</a>=1;</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* With that done, we can initialize libkate for encoding, and initialize libogg as well: */</span></div>
<div class="line"> </div>
<div class="line"> <a id="a8" name="a8"></a><a class="code hl_function" href="group__encoding.html#ga0a7588d43b22fd5ef6e0a88ed7245210">kate_encode_init</a>(&k,&ki);</div>
<div class="line"> ogg_stream_init(&os,0x12345678);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* for the benefit of windows, which mangles data otherwise */</span></div>
<div class="line"> set_binary_file(stdout);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> Before you can create events, headers need to be sent. Here, we'll just send</span></div>
<div class="line"><span class="comment"> the headers directly, but you will usually want to add regions, styles, etc to</span></div>
<div class="line"><span class="comment"> the headers before doing so:</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> <span class="keywordflow">while</span> (<a id="a9" name="a9"></a><a class="code hl_function" href="oggkate_8h.html#ac9f5a00fc71e781a8c18bccb12c3f9f7">kate_ogg_encode_headers</a>(&k,&kc,&op)==0) {</div>
<div class="line"> ogg_stream_packetin(&os,&op);</div>
<div class="line"> ogg_packet_clear(&op);</div>
<div class="line"> }</div>
<div class="line"> flush_page(&os);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> Events can now be created, and we'll just create and send a single one here,</span></div>
<div class="line"><span class="comment"> starting at time 10 seconds, and stopping at time 15 seconds.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#define text "Hello, world!"</span></div>
<div class="line"> <a id="a10" name="a10"></a><a class="code hl_function" href="oggkate_8h.html#aa66db5293b6c4afa2fbbf536d0d1e4dd">kate_ogg_encode_text</a>(&k,10.0,15.0,text,strlen(text)+1,&op);</div>
<div class="line"> ogg_stream_packetin(&os,&op);</div>
<div class="line"> ogg_packet_clear(&op);</div>
<div class="line"> flush_page(&os);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> When we're done, we can tell libkate so an "end of stream" packet will be generated,</span></div>
<div class="line"><span class="comment"> and clear the resources we've been using:</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> <a id="a11" name="a11"></a><a class="code hl_function" href="oggkate_8h.html#a28a9b117b4051ed02c761f279d5c34ee">kate_ogg_encode_finish</a>(&k,-1,&op);</div>
<div class="line"> ogg_stream_packetin(&os,&op);</div>
<div class="line"> ogg_packet_clear(&op);</div>
<div class="line"> flush_page(&os);</div>
<div class="line"> ogg_stream_clear(&os);</div>
<div class="line"> <a id="a12" name="a12"></a><a class="code hl_function" href="kate_8h.html#a8617b44c49f19262a9e03c0dcb45d971">kate_clear</a>(&k);</div>
<div class="line"> <a id="a13" name="a13"></a><a class="code hl_function" href="group__info.html#gaa8ba295f7925e8926ed46510c28be60d">kate_info_clear</a>(&ki);</div>
<div class="line"> <a id="a14" name="a14"></a><a class="code hl_function" href="group__comments.html#ga92e532be93459a5b1d6835b64c1129da">kate_comment_clear</a>(&kc);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> That's it, we now have created a full kate stream. You may now want to decode it,</span></div>
<div class="line"><span class="comment"> or multiplex it with a Theora video, etc.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> <span class="keywordflow">return</span> 0;</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="ttc" id="agroup__comments_html_ga4f717746ed53e557e57bb1e2b40dbd84"><div class="ttname"><a href="group__comments.html#ga4f717746ed53e557e57bb1e2b40dbd84">kate_comment_init</a></div><div class="ttdeci">int kate_comment_init(kate_comment *kc)</div><div class="ttdef"><b>Definition:</b> kate_comment.c:29</div></div>
<div class="ttc" id="agroup__comments_html_ga92e532be93459a5b1d6835b64c1129da"><div class="ttname"><a href="group__comments.html#ga92e532be93459a5b1d6835b64c1129da">kate_comment_clear</a></div><div class="ttdeci">int kate_comment_clear(kate_comment *kc)</div><div class="ttdef"><b>Definition:</b> kate_comment.c:48</div></div>
<div class="ttc" id="agroup__encoding_html_ga0a7588d43b22fd5ef6e0a88ed7245210"><div class="ttname"><a href="group__encoding.html#ga0a7588d43b22fd5ef6e0a88ed7245210">kate_encode_init</a></div><div class="ttdeci">int kate_encode_init(kate_state *k, kate_info *ki)</div><div class="ttdef"><b>Definition:</b> kate_encode.c:36</div></div>
<div class="ttc" id="agroup__info_html_gaa8ba295f7925e8926ed46510c28be60d"><div class="ttname"><a href="group__info.html#gaa8ba295f7925e8926ed46510c28be60d">kate_info_clear</a></div><div class="ttdeci">int kate_info_clear(kate_info *ki)</div><div class="ttdef"><b>Definition:</b> kate_info.c:539</div></div>
<div class="ttc" id="agroup__info_html_gab9031b2c167954bc7d754b30774f0241"><div class="ttname"><a href="group__info.html#gab9031b2c167954bc7d754b30774f0241">kate_info_init</a></div><div class="ttdeci">int kate_info_init(kate_info *ki)</div><div class="ttdef"><b>Definition:</b> kate_info.c:29</div></div>
<div class="ttc" id="akate_8h_html_a8617b44c49f19262a9e03c0dcb45d971"><div class="ttname"><a href="kate_8h.html#a8617b44c49f19262a9e03c0dcb45d971">kate_clear</a></div><div class="ttdeci">int kate_clear(kate_state *k)</div><div class="ttdef"><b>Definition:</b> kate.c:74</div></div>
<div class="ttc" id="aoggkate_8h_html"><div class="ttname"><a href="oggkate_8h.html">oggkate.h</a></div></div>
<div class="ttc" id="aoggkate_8h_html_a28a9b117b4051ed02c761f279d5c34ee"><div class="ttname"><a href="oggkate_8h.html#a28a9b117b4051ed02c761f279d5c34ee">kate_ogg_encode_finish</a></div><div class="ttdeci">int kate_ogg_encode_finish(kate_state *k, kate_float t, ogg_packet *op)</div><div class="ttdef"><b>Definition:</b> kate_ogg.c:193</div></div>
<div class="ttc" id="aoggkate_8h_html_aa66db5293b6c4afa2fbbf536d0d1e4dd"><div class="ttname"><a href="oggkate_8h.html#aa66db5293b6c4afa2fbbf536d0d1e4dd">kate_ogg_encode_text</a></div><div class="ttdeci">int kate_ogg_encode_text(kate_state *k, kate_float start_time, kate_float stop_time, const char *text, size_t sz, ogg_packet *op)</div><div class="ttdef"><b>Definition:</b> kate_ogg.c:75</div></div>
<div class="ttc" id="aoggkate_8h_html_ac9f5a00fc71e781a8c18bccb12c3f9f7"><div class="ttname"><a href="oggkate_8h.html#ac9f5a00fc71e781a8c18bccb12c3f9f7">kate_ogg_encode_headers</a></div><div class="ttdeci">int kate_ogg_encode_headers(kate_state *k, kate_comment *kc, ogg_packet *op)</div><div class="ttdef"><b>Definition:</b> kate_ogg.c:54</div></div>
<div class="ttc" id="astructkate__comment_html"><div class="ttname"><a href="structkate__comment.html">kate_comment</a></div><div class="ttdef"><b>Definition:</b> kate.h:347</div></div>
<div class="ttc" id="astructkate__info_html"><div class="ttname"><a href="structkate__info.html">kate_info</a></div><div class="ttdef"><b>Definition:</b> kate.h:274</div></div>
<div class="ttc" id="astructkate__info_html_a00c2253966d5a22cc3e56f4f98dd4995"><div class="ttname"><a href="structkate__info.html#a00c2253966d5a22cc3e56f4f98dd4995">kate_info::gps_denominator</a></div><div class="ttdeci">kate_uint32_t gps_denominator</div><div class="ttdef"><b>Definition:</b> kate.h:287</div></div>
<div class="ttc" id="astructkate__info_html_a1bf457732577344fa6d0f035d30d1e13"><div class="ttname"><a href="structkate__info.html#a1bf457732577344fa6d0f035d30d1e13">kate_info::granule_shift</a></div><div class="ttdeci">unsigned char granule_shift</div><div class="ttdef"><b>Definition:</b> kate.h:283</div></div>
<div class="ttc" id="astructkate__info_html_a7eb196702d96e5676b27838cadfd6acf"><div class="ttname"><a href="structkate__info.html#a7eb196702d96e5676b27838cadfd6acf">kate_info::gps_numerator</a></div><div class="ttdeci">kate_uint32_t gps_numerator</div><div class="ttdef"><b>Definition:</b> kate.h:286</div></div>
<div class="ttc" id="astructkate__state_html"><div class="ttname"><a href="structkate__state.html">kate_state</a></div><div class="ttdef"><b>Definition:</b> kate.h:336</div></div>
</div><!-- fragment --> </div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
|