• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3<title>oscl_media_data.h Source File</title>
4<link href="doxygen.css" rel="stylesheet" type="text/css">
5</head><body>
6<!-- Generated by Doxygen 1.2.18 -->
7<center>
8<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; </center>
9<hr><h1>oscl_media_data.h</h1><a href="oscl__media__data_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">// -*- c++ -*-</span>
1000002 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span>
1100003
1200004 <span class="comment">//               O S C L _ M E D I A _ D A T A</span>
1300005
1400006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span>
1500007
1600018 <span class="preprocessor">#ifndef OSCL_MEDIA_DATA_H</span>
1700019 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_MEDIA_DATA_H</span>
1800020 <span class="preprocessor"></span>
1900021 <span class="preprocessor">#ifndef OSCL_BASE_H_INCLUDED</span>
2000022 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__base_8h.html">oscl_base.h</a>"</span>
2100023 <span class="preprocessor">#endif</span>
2200024 <span class="preprocessor"></span>
2300025 <span class="preprocessor">#ifndef OSCL_MEM_BASIC_FUNCTIONS_H_INCLUDED</span>
2400026 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__mem__basic__functions_8h.html">oscl_mem_basic_functions.h</a>"</span>
2500027 <span class="preprocessor">#endif</span>
2600028 <span class="preprocessor"></span>
2700029 <span class="preprocessor">#ifndef OSCL_MEDIA_STATUS_H_INCLUDED</span>
2800030 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__media__status_8h.html">oscl_media_status.h</a>"</span>
2900031 <span class="preprocessor">#endif</span>
3000032 <span class="preprocessor"></span>
31<a name="l00033"></a><a class="code" href="group__osclutil.html#a1">00033</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__osclutil.html#a1">BufferFreeFuncPtr</a>)(<span class="keywordtype">void</span> *);
3200034
33<a name="l00035"></a><a class="code" href="group__osclutil.html#a2">00035</a> <span class="keyword">typedef</span> uint32 <a class="code" href="group__osclutil.html#a2">MediaTimestamp</a>;
3400036
35<a name="l00037"></a><a class="code" href="classMemAllocator.html">00037</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span><a class="code" href="classMemAllocator.html">MemAllocator</a>
3600038 {
3700039     <span class="keyword">public</span>:
38<a name="l00040"></a><a class="code" href="classMemAllocator.html#s0">00040</a>         <span class="keyword">typedef</span> T* <a class="code" href="classMemAllocator.html#s0">pointer</a>;
3900041         <span class="comment">//  virtual pointer allocate(size_t size, void *hint = 0) = 0;</span>
4000042         <span class="keyword">virtual</span> <a class="code" href="classMemAllocator.html#s0">pointer</a> <a class="code" href="classMemAllocator.html#a0">allocate</a>(<span class="keywordtype">void</span> * hint = 0, <span class="keyword">const</span> <span class="keywordtype">int</span> num_reserved_frags = 1) = 0;
4100043         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classMemAllocator.html#a1">deallocate</a>(<a class="code" href="classMemAllocator.html#s0">pointer</a> p) = 0;
42<a name="l00044"></a><a class="code" href="classMemAllocator.html#a2">00044</a>         <span class="keyword">virtual</span> <a class="code" href="classMemAllocator.html#a2">~MemAllocator</a>() {}
4300045 };
4400046
4500047 <span class="keyword">class </span><a class="code" href="classBufferState.html">BufferState</a>;
4600048 <span class="comment">/* Buffer referee (how about the "whistle blower" ?*/</span>
47<a name="l00049"></a><a class="code" href="classBufferMgr.html">00049</a> <span class="keyword">class </span><a class="code" href="classBufferMgr.html">BufferMgr</a>
4800050 {
4900051     <span class="keyword">public</span>:
5000052         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classBufferMgr.html#a0">BufferReleased</a>(<span class="keywordtype">void</span>* ptr, <a class="code" href="classBufferState.html">BufferState</a>* state = <a class="code" href="group__osclbase.html#a81">NULL</a>) = 0;
51<a name="l00053"></a><a class="code" href="classBufferMgr.html#a1">00053</a>         <span class="keyword">virtual</span> <a class="code" href="classBufferMgr.html#a1">~BufferMgr</a>() {}
5200054 };
5300055
5400056
55<a name="l00057"></a><a class="code" href="classBufferState.html">00057</a> <span class="keyword">class </span><a class="code" href="classBufferState.html">BufferState</a>
5600058 {
5700059     <span class="keyword">public</span>:
58<a name="l00060"></a><a class="code" href="classBufferState.html#a0">00060</a>         <a class="code" href="classBufferState.html#a0">BufferState</a>(<a class="code" href="group__osclutil.html#a1">BufferFreeFuncPtr</a> the_free_function, <span class="keywordtype">void</span> *bufptr = 0) :
5900061                 refcount(0), ptr(bufptr), free_function(the_free_function), buf_mgr(0) {};
6000062
61<a name="l00063"></a><a class="code" href="classBufferState.html#a1">00063</a>         <a class="code" href="classBufferState.html#a0">BufferState</a>(<a class="code" href="classBufferMgr.html">BufferMgr</a>* the_buf_mgr = 0, <span class="keywordtype">void</span> *bufptr = 0) :
6200064                 refcount(0), ptr(bufptr), free_function(0), buf_mgr(the_buf_mgr) {};
6300065
64<a name="l00066"></a><a class="code" href="classBufferState.html#a2">00066</a>         <span class="keywordtype">void</span> <a class="code" href="classBufferState.html#a2">increment_refcnt</a>()
6500067         {
6600068             ++refcount;
6700069         };
68<a name="l00070"></a><a class="code" href="classBufferState.html#a3">00070</a>         <span class="keywordtype">void</span> <a class="code" href="classBufferState.html#a3">decrement_refcnt</a>()
6900071         {
7000072             <span class="keywordflow">if</span> (!(--refcount))
7100073             {
7200074                 <span class="keywordflow">if</span> (buf_mgr) buf_mgr-&gt;<a class="code" href="classBufferMgr.html#a0">BufferReleased</a>(ptr, <span class="keyword">this</span>);
7300075                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (free_function)
7400076                 {
7500077                     free_function(ptr);
7600078                     ptr = 0;
7700079                 }
7800080             }
7900081         };
8000082
81<a name="l00083"></a><a class="code" href="classBufferState.html#a4">00083</a>         <span class="keywordtype">void</span> <a class="code" href="classBufferState.html#a4">bind</a>(<span class="keywordtype">void</span> *in_ptr, <a class="code" href="group__osclutil.html#a1">BufferFreeFuncPtr</a> in_free_function)
8200084         {
8300085             refcount = 0;
8400086             ptr = in_ptr, free_function = in_free_function;
8500087
8600088         };
87<a name="l00089"></a><a class="code" href="classBufferState.html#a5">00089</a>         <span class="keywordtype">void</span> <a class="code" href="classBufferState.html#a4">bind</a>(<span class="keywordtype">void</span> *in_ptr, <a class="code" href="classBufferMgr.html">BufferMgr</a>* in_buf_mgr)
8800090         {
8900091             refcount = 0;
9000092             ptr = in_ptr, buf_mgr = in_buf_mgr;
9100093         };
9200094
93<a name="l00095"></a><a class="code" href="classBufferState.html#a6">00095</a>         <span class="keywordtype">void</span> *<a class="code" href="classBufferState.html#a6">get_ptr</a>()
9400096         {
9500097             <span class="keywordflow">return</span> ptr;
9600098         };
97<a name="l00099"></a><a class="code" href="classBufferState.html#a7">00099</a>         int32 <a class="code" href="classBufferState.html#a7">get_refcount</a>()
9800100         {
9900101             <span class="keywordflow">return</span> refcount;
10000102         };
10100103
102<a name="l00104"></a><a class="code" href="classBufferState.html#a8">00104</a>         <a class="code" href="group__osclutil.html#a1">BufferFreeFuncPtr</a> <a class="code" href="classBufferState.html#a8">get_free_function</a>()
10300105         {
10400106             <span class="keywordflow">return</span> free_function;
10500107         };
106<a name="l00108"></a><a class="code" href="classBufferState.html#a9">00108</a>         <a class="code" href="classBufferMgr.html">BufferMgr</a>* <a class="code" href="classBufferState.html#a9">get_buf_mgr</a>()
10700109         {
10800110             <span class="keywordflow">return</span> buf_mgr;
10900111         };
11000112
111<a name="l00113"></a><a class="code" href="classBufferState.html#a10">00113</a>         <span class="keywordtype">void</span> <a class="code" href="classBufferState.html#a10">reset</a>()
11200114         {
11300115             refcount = 0;
11400116             ptr = 0;
11500117         };
11600118
11700119     <span class="keyword">private</span>:
11800120         int32 refcount;
11900121         <span class="keywordtype">void</span> *ptr;
12000122         <a class="code" href="group__osclutil.html#a1">BufferFreeFuncPtr</a> free_function; <span class="comment">// called to free the buffer</span>
12100123         <a class="code" href="classBufferMgr.html">BufferMgr</a>* buf_mgr; <span class="comment">// called to free the buffer</span>
12200124 };
12300125
12400126
12500127 <span class="comment">// BufferFragment is a special case of a memory</span>
12600128 <span class="comment">// fragment since it refers to fragments of a reference</span>
12700129 <span class="comment">// counted memory.  The name is used to make this explicit.</span>
128<a name="l00130"></a><a class="code" href="classBufferFragment.html">00130</a> <span class="keyword">class </span><a class="code" href="classBufferFragment.html">BufferFragment</a> : <span class="keyword">public</span> <a class="code" href="structOsclMemoryFragment.html">OsclMemoryFragment</a> {};
12900131
13000132
131<a name="l00133"></a><a class="code" href="classBufFragGroup.html">00133</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags&gt; <span class="keyword">class </span><a class="code" href="classBufFragGroup.html">BufFragGroup</a>
13200134 {
13300135     <span class="keyword">public</span>:
13400136
13500137
136<a name="l00138"></a><a class="code" href="classBufFragGroup.html#a0">00138</a>         <a class="code" href="classBufFragGroup.html#a0">BufFragGroup</a>(): <a class="code" href="classBufFragGroup.html#n2">next</a>(0), <a class="code" href="classBufFragGroup.html#n3">num_fragments</a>(0), <a class="code" href="classBufFragGroup.html#n4">length</a>(0)
13700139         {
13800140             <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(<a class="code" href="classBufFragGroup.html#n0">fragments</a>, 0, <span class="keyword">sizeof</span>(<a class="code" href="classBufFragGroup.html#n0">fragments</a>));
13900141             <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>, 0, <span class="keyword">sizeof</span>(<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>));
14000142         };
14100143
142<a name="l00144"></a><a class="code" href="classBufFragGroup.html#a1">00144</a>         <span class="keyword">virtual</span> <a class="code" href="classBufFragGroup.html#a1">~BufFragGroup</a>() {}
14300145
144<a name="l00146"></a><a class="code" href="classBufFragGroup.html#a2">00146</a>         int32 <a class="code" href="classBufFragGroup.html#a2">GetMaxFrags</a>()<span class="keyword"> const</span>
14500147 <span class="keyword">        </span>{
14600148             <span class="keywordflow">return</span> max_frags;
14700149         };
148<a name="l00150"></a><a class="code" href="classBufFragGroup.html#a3">00150</a>         int32 <a class="code" href="classBufFragGroup.html#a3">GetNumFrags</a>()<span class="keyword"> const</span>
14900151 <span class="keyword">        </span>{
15000152             <span class="keywordflow">return</span> <a class="code" href="classBufFragGroup.html#n3">num_fragments</a>;
15100153         };
152<a name="l00154"></a><a class="code" href="classBufFragGroup.html#a4">00154</a>         uint32 <a class="code" href="classBufFragGroup.html#a4">GetLength</a>()<span class="keyword"> const</span>
15300155 <span class="keyword">        </span>{
15400156             <span class="keywordflow">return</span> <a class="code" href="classBufFragGroup.html#n4">length</a>;
15500157         };
15600158
15700159         <a class="code" href="classBufferFragment.html">BufferFragment</a> * <a class="code" href="group__osclutil.html#a48">GetFragment</a>(<span class="keyword">const</span> int32 idx);
15800160
15900161         <a class="code" href="classBufferState.html">BufferState</a> * <a class="code" href="group__osclutil.html#a49">GetBufferState</a>(<span class="keyword">const</span> int32 idx);
16000162
161<a name="l00163"></a><a class="code" href="classBufFragGroup.html#a7">00163</a>         <span class="keywordtype">void</span> <a class="code" href="classBufFragGroup.html#a7">AppendNext</a>(ChainClass* next_ptr)
16200164         {
16300165             <a class="code" href="classBufFragGroup.html#n2">next</a> = next_ptr;
16400166         };
165<a name="l00167"></a><a class="code" href="classBufFragGroup.html#a8">00167</a>         ChainClass* <a class="code" href="classBufFragGroup.html#a8">GetNext</a>()<span class="keyword"> const</span>
16600168 <span class="keyword">        </span>{
16700169             <span class="keywordflow">return</span> <a class="code" href="classBufFragGroup.html#n2">next</a>;
16800170         };
16900171
17000172         <span class="comment">// make fragment array accessible to allow usage within socket</span>
17100173         <span class="comment">// send functions.</span>
17200174
17300175     <span class="keyword">protected</span>:
17400176
17500177
17600178         <span class="comment">// BufferFragment * GetFragment(const uint32 idx) const;</span>
17700179
17800180
17900181
180<a name="l00182"></a><a class="code" href="classBufFragGroup.html#b0">00182</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classBufFragGroup.html#b0">Clear</a>()
18100183         {
18200184             <span class="keywordflow">for</span> (<a class="code" href="group__osclbase.html#a27">uint</a> ii = 0 ; ii &lt; <a class="code" href="classBufFragGroup.html#n3">num_fragments</a>; ++ii)
18300185             {
18400186                 <span class="keywordflow">if</span> (<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[ii])
18500187                 {
18600188                     <a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[ii]-&gt;<a class="code" href="classBufferState.html#a3">decrement_refcnt</a>();
18700189                 }
18800190             }
18900191             <a class="code" href="classBufFragGroup.html#n3">num_fragments</a> = <a class="code" href="classBufFragGroup.html#n4">length</a> = 0;
19000192             <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>, 0, <span class="keyword">sizeof</span>(<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>));
19100193             <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(<a class="code" href="classBufFragGroup.html#n0">fragments</a>, 0, <span class="keyword">sizeof</span>(<a class="code" href="classBufFragGroup.html#n0">fragments</a>));
19200194         };
19300195
194<a name="l00196"></a><a class="code" href="classBufFragGroup.html#b1">00196</a>         <a class="code" href="classBufFragStatusClass.html#s8">BufFragStatusClass::status_t</a> <a class="code" href="classBufFragGroup.html#b1">AddFragment</a>(<span class="keyword">const</span> <a class="code" href="classBufferFragment.html">BufferFragment</a>&amp; frag, <a class="code" href="classBufferState.html">BufferState</a>* in_buffer_state,
19500197                 int32 location_offset = max_frags)
19600198         {
19700199             <span class="keywordflow">if</span> (<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> &gt; max_frags)
19800200             {
19900201                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s1">BufFragStatusClass::TOO_MANY_FRAGS</a>;
20000202             }
20100203             <span class="keywordflow">if</span> (frag.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> == <a class="code" href="group__osclbase.html#a81">NULL</a>)
20200204             {
20300205                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s3">BufFragStatusClass::EMPTY_FRAGMENT</a>;
20400206             }
20500207
20600208             <span class="keywordflow">if</span> (location_offset &gt;= 0 &amp;&amp; location_offset &lt; (int32) <a class="code" href="classBufFragGroup.html#n3">num_fragments</a>)
20700209             {
20800210                 <span class="keywordflow">if</span> (<a class="code" href="classBufFragGroup.html#n0">fragments</a>[location_offset].<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a>)
20900211                 {
21000212                     <span class="comment">// make room for the new fragment</span>
21100213                     <a class="code" href="group__osclmemory.html#a12">oscl_memmove</a>(<a class="code" href="classBufFragGroup.html#n0">fragments</a> + location_offset + 1, <a class="code" href="classBufFragGroup.html#n0">fragments</a> + location_offset,
21200214                                  (<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> - location_offset)*<span class="keyword">sizeof</span>(<a class="code" href="classBufferFragment.html">BufferFragment</a>));
21300215                     <a class="code" href="group__osclmemory.html#a12">oscl_memmove</a>(<a class="code" href="classBufFragGroup.html#n1">buffer_states</a> + location_offset + 1, <a class="code" href="classBufFragGroup.html#n1">buffer_states</a> + location_offset,
21400216                                  (<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> - location_offset)*<span class="keyword">sizeof</span>(<a class="code" href="classBufferState.html">BufferState</a>*));
21500217                     ++<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>; <span class="comment">/* increment the number of fragments if a move</span>
21600218 <span class="comment">                          * is necessary.  If the location was empty, then</span>
21700219 <span class="comment">                          * has already been reserved and counted.</span>
21800220 <span class="comment">                          */</span>
21900221                 }
22000222                 <a class="code" href="classBufFragGroup.html#n0">fragments</a>[location_offset] = frag;
22100223                 <a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[location_offset] = in_buffer_state;
22200224                 <span class="keywordflow">if</span> (in_buffer_state) in_buffer_state-&gt;<a class="code" href="classBufferState.html#a2">increment_refcnt</a>();
22300225                 <a class="code" href="classBufFragGroup.html#n4">length</a> += frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
22400226                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s0">BufFragStatusClass::BFG_SUCCESS</a>;
22500227             }
22600228
22700229             <span class="comment">// append the new fragment to the end</span>
22800230             <a class="code" href="classBufFragGroup.html#n0">fragments</a>[<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>] = frag;
22900231             <a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>++] = in_buffer_state;
23000232             <a class="code" href="classBufFragGroup.html#n4">length</a> += frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
23100233             <span class="keywordflow">if</span> (in_buffer_state) in_buffer_state-&gt;<a class="code" href="classBufferState.html#a2">increment_refcnt</a>();
23200234             <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s0">BufFragStatusClass::BFG_SUCCESS</a>;
23300235         };
23400236
235<a name="l00237"></a><a class="code" href="classBufFragGroup.html#n0">00237</a>         <a class="code" href="classBufferFragment.html">BufferFragment</a> <a class="code" href="classBufFragGroup.html#n0">fragments</a>[max_frags];
236<a name="l00238"></a><a class="code" href="classBufFragGroup.html#n1">00238</a>         <a class="code" href="classBufferState.html">BufferState</a>* <a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[max_frags];
237<a name="l00239"></a><a class="code" href="classBufFragGroup.html#n2">00239</a>         ChainClass* <a class="code" href="classBufFragGroup.html#n2">next</a>;
238<a name="l00240"></a><a class="code" href="classBufFragGroup.html#n3">00240</a>         uint32 <a class="code" href="classBufFragGroup.html#n3">num_fragments</a>;
239<a name="l00241"></a><a class="code" href="classBufFragGroup.html#n4">00241</a>         uint32 <a class="code" href="classBufFragGroup.html#n4">length</a>;
24000242 };
24100243
242<a name="l00244"></a><a class="code" href="classBufFragGroup.html#a48">00244</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags&gt; <span class="keyword">inline</span> <a class="code" href="classBufferFragment.html">BufferFragment</a> *  <a class="code" href="group__osclutil.html#a48">BufFragGroup&lt;ChainClass, max_frags&gt; :: GetFragment</a>(<span class="keyword">const</span> int32 idx)
24300245 {
24400246     <span class="keywordflow">if</span> (idx &lt; (int)num_fragments &amp;&amp; idx &gt;= 0)
24500247     {
24600248         <span class="keywordflow">return</span> &amp; <a class="code" href="classBufFragGroup.html#n0">fragments</a>[idx];
24700249     }
24800250     <span class="keywordflow">else</span>
24900251     {
25000252         <span class="keywordflow">return</span> <a class="code" href="group__osclbase.html#a81">NULL</a>;
25100253     }
25200254 }
25300255
254<a name="l00256"></a><a class="code" href="classBufFragGroup.html#a49">00256</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags&gt; <span class="keyword">inline</span> <a class="code" href="classBufferState.html">BufferState</a> *  <a class="code" href="group__osclutil.html#a49">BufFragGroup&lt;ChainClass, max_frags&gt; :: GetBufferState</a>(<span class="keyword">const</span> int32 idx)
25500257 {
25600258     <span class="keywordflow">if</span> (idx &lt; (int)num_fragments &amp;&amp; idx &gt;= 0)
25700259     {
25800260         <span class="keywordflow">return</span>  <a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[idx];
25900261     }
26000262     <span class="keywordflow">else</span>
26100263     {
26200264         <span class="keywordflow">return</span> <a class="code" href="group__osclbase.html#a81">NULL</a>;
26300265     }
26400266 }
26500267
26600268
267<a name="l00269"></a><a class="code" href="classMediaData.html">00269</a> <span class="keyword">template</span> &lt;<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags, u<span class="keywordtype">int</span>32 local_bufsize&gt; <span class="keyword">class </span><a class="code" href="classMediaData.html">MediaData</a> :
26800270             <span class="keyword">public</span> <a class="code" href="classBufFragGroup.html">BufFragGroup</a>&lt;ChainClass, max_frags&gt;
26900271 {
27000272
27100273     <span class="keyword">public</span>:
272<a name="l00274"></a><a class="code" href="classMediaData.html#a0">00274</a>         <a class="code" href="classMediaData.html#a0">MediaData</a>(): <a class="code" href="classMediaData.html#n0">timestamp</a>(0), <a class="code" href="classMediaData.html#n2">available_localbuf</a>(local_bufsize), <a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>(0) {};
27300275
274<a name="l00276"></a><a class="code" href="classMediaData.html#a1">00276</a>         <span class="keyword">virtual</span> <a class="code" href="classMediaData.html#a1">~MediaData</a>() {}
27500277
276<a name="l00278"></a><a class="code" href="classMediaData.html#a2">00278</a>         uint32 <a class="code" href="classMediaData.html#a2">GetLocalBufsize</a>()<span class="keyword"> const</span>
27700279 <span class="keyword">        </span>{
27800280             <span class="keywordflow">return</span> local_bufsize;
27900281         };
280<a name="l00282"></a><a class="code" href="classMediaData.html#a3">00282</a>         <a class="code" href="group__osclutil.html#a2">MediaTimestamp</a> <a class="code" href="classMediaData.html#a3">GetTimestamp</a>()<span class="keyword"> const</span>
28100283 <span class="keyword">        </span>{
28200284             <span class="keywordflow">return</span> <a class="code" href="classMediaData.html#n0">timestamp</a>;
28300285         };
284<a name="l00286"></a><a class="code" href="classMediaData.html#a4">00286</a>         <span class="keywordtype">void</span> <a class="code" href="classMediaData.html#a4">SetTimestamp</a>(<a class="code" href="group__osclutil.html#a2">MediaTimestamp</a> in_timestamp)
28500287         {
28600288             <a class="code" href="classMediaData.html#n0">timestamp</a> = in_timestamp;
28700289         };
288<a name="l00290"></a><a class="code" href="classMediaData.html#a5">00290</a>         uint32 <a class="code" href="classMediaData.html#a5">GetAvailableBufferSize</a>()<span class="keyword"> const</span>
28900291 <span class="keyword">        </span>{
29000292             <span class="keywordflow">return</span> <a class="code" href="classMediaData.html#n2">available_localbuf</a>;
29100293         };
29200294
29300295
29400296
29500297         <span class="comment">// The input should be initialized so that the fragment length is the</span>
29600298         <span class="comment">// request size.  The returned value will have a non-NULL pointer if the</span>
29700299         <span class="comment">// request could be fulfilled.</span>
298<a name="l00300"></a><a class="code" href="classMediaData.html#a6">00300</a>         <a class="code" href="classBufFragStatusClass.html#s8">MediaStatusClass::status_t</a> <a class="code" href="classMediaData.html#a6">GetLocalFragment</a>(<a class="code" href="classBufferFragment.html">BufferFragment</a>&amp; fragment)
29900301         {
30000302             <span class="keywordflow">if</span> (fragment.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> &gt; <a class="code" href="classMediaData.html#n2">available_localbuf</a>)
30100303             {
30200304                 fragment.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> = <a class="code" href="group__osclbase.html#a81">NULL</a>;
30300305                 fragment.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> = <a class="code" href="classMediaData.html#n2">available_localbuf</a>;
30400306                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s2">MediaStatusClass::NOT_ENOUGH_SPACE</a>;
30500307             }
30600308
30700309             fragment.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> = <a class="code" href="classMediaData.html#n1">localbuf</a> + (local_bufsize - <a class="code" href="classMediaData.html#n2">available_localbuf</a>);
30800310             <a class="code" href="classMediaData.html#n2">available_localbuf</a> -= fragment.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
30900311             <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s0">MediaStatusClass::BFG_SUCCESS</a>;
31000312         };
31100313
312<a name="l00314"></a><a class="code" href="classMediaData.html#a7">00314</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classMediaData.html#a7">Clear</a>()
31300315         {
31400316             <span class="keywordflow">for</span> (<a class="code" href="group__osclbase.html#a27">uint</a> ii = 0 ; ii &lt; this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>; ++ii)
31500317             {
31600318                 <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[ii])
31700319                 {
31800320                     this-&gt;<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[ii]-&gt;<a class="code" href="classBufferState.html#a3">decrement_refcnt</a>();
31900321                 }
32000322             }
32100323             this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> = 0;
32200324             this-&gt;<a class="code" href="classBufFragGroup.html#n4">length</a> = 0;
32300325             <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(this-&gt;buffer_states, 0, <span class="keyword">sizeof</span>(this-&gt;buffer_states));
32400326             <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(this-&gt;fragments, 0, <span class="keyword">sizeof</span>(this-&gt;fragments));
32500327             this-&gt;<a class="code" href="classMediaData.html#n2">available_localbuf</a> = local_bufsize;
32600328         };
32700329
32800330
329<a name="l00331"></a><a class="code" href="classMediaData.html#a8">00331</a>         <span class="keywordtype">bool</span> <a class="code" href="classMediaData.html#a8">IsLocalData</a>(<span class="keyword">const</span> <a class="code" href="structOsclMemoryFragment.html">OsclMemoryFragment</a>&amp; frag)<span class="keyword"> const</span>
33000332 <span class="keyword">        </span>{
33100333             <span class="keywordflow">if</span> (frag.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> == <a class="code" href="group__osclbase.html#a81">NULL</a>)
33200334                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
33300335             <span class="keywordflow">if</span> ((uint8 *)frag.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> &gt;= <a class="code" href="classMediaData.html#n1">localbuf</a>)
33400336             {
33500337                 <span class="keywordflow">if</span> (((uint8 *)frag.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a>) + frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> &lt; <a class="code" href="classMediaData.html#n1">localbuf</a> + local_bufsize)
33600338                 {
33700339                     <span class="keywordflow">return</span> <span class="keyword">true</span>;
33800340                 }
33900341                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
34000342             }
34100343             <span class="keywordflow">return</span> <span class="keyword">false</span>;
34200344         }
34300345
344<a name="l00346"></a><a class="code" href="classMediaData.html#a9">00346</a>         <span class="keywordtype">int</span> <a class="code" href="classMediaData.html#a9">GetMediaSize</a>()<span class="keyword"> const</span>
34500347 <span class="keyword">        </span>{
34600348             <span class="keywordtype">int</span> num_reserved = 0;
34700349             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> ii = 0; ii &lt; <a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>; ii++)
34800350                 num_reserved += this-&gt;<a class="code" href="classBufFragGroup.html#n0">fragments</a>[ii].<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
34900351
35000352             <span class="keywordflow">return</span> (this-&gt;<a class="code" href="classBufFragGroup.html#n4">length</a> - num_reserved);
35100353         }
35200354
353<a name="l00355"></a><a class="code" href="classMediaData.html#a10">00355</a>         <a class="code" href="classBufferFragment.html">BufferFragment</a> * <a class="code" href="classMediaData.html#a10">GetMediaFragment</a>(<span class="keyword">const</span> uint32 idx)
35400356         {
35500357             uint32 tmp = idx + this-&gt;<a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>;
35600358             <span class="keywordflow">if</span> (tmp &gt; this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>)
35700359             {
35800360                 <span class="keywordflow">return</span> <a class="code" href="group__osclbase.html#a81">NULL</a>;
35900361             }
36000362             <span class="keywordflow">else</span>
36100363             {
36200364                 <span class="keywordflow">return</span> &amp; this-&gt;<a class="code" href="classBufFragGroup.html#n0">fragments</a>[tmp];
36300365             }
36400366         }
36500367
366<a name="l00368"></a><a class="code" href="classMediaData.html#a11">00368</a>         uint32 <a class="code" href="classMediaData.html#a11">GetNumMediaFrags</a>(<span class="keyword">const</span> uint32 idx)<span class="keyword"> const</span>
36700369 <span class="keyword">        </span>{
36800370             <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> &gt;= this-&gt;<a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>)
36900371                 <span class="keywordflow">return</span> this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> - this-&gt;<a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>;
37000372             <span class="keywordflow">else</span> <span class="keywordflow">return</span> 0;
37100373         }
37200374
37300375     <span class="keyword">protected</span>:
37400376         <span class="comment">// This function copies the fragment data to the local buffer</span>
375<a name="l00377"></a><a class="code" href="classMediaData.html#b0">00377</a>         <a class="code" href="classBufFragStatusClass.html#s8">MediaStatusClass::status_t</a> <a class="code" href="classMediaData.html#b0">AddLocalFragment</a>(<span class="keyword">const</span> <a class="code" href="classBufferFragment.html">BufferFragment</a>&amp; frag,
37600378                 int32 location_offset)
37700379         {
37800380
37900381             <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a> &gt; max_frags)
38000382             {
38100383                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s1">MediaStatusClass::TOO_MANY_FRAGS</a>;
38200384             }
38300385
38400386             <span class="keywordflow">if</span> (frag.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> == <a class="code" href="group__osclbase.html#a81">NULL</a> || frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> == 0)
38500387             {
38600388                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s3">MediaStatusClass::EMPTY_FRAGMENT</a>;
38700389             }
38800390
38900391             <span class="comment">// see if there is enough room in the local buffer</span>
39000392             <span class="keywordflow">if</span> (frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> &gt; <a class="code" href="classMediaData.html#n2">available_localbuf</a>)
39100393             {
39200394                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s2">MediaStatusClass::NOT_ENOUGH_SPACE</a>;
39300395             }
39400396
39500397             <span class="comment">// get the fragment</span>
39600398             <a class="code" href="classBufferFragment.html">BufferFragment</a> local_fragment;
39700399             local_fragment.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> = frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
39800400             local_fragment.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a> = <a class="code" href="classMediaData.html#n1">localbuf</a> + (local_bufsize - <a class="code" href="classMediaData.html#n2">available_localbuf</a>);
39900401             <a class="code" href="classMediaData.html#n2">available_localbuf</a> -= frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
40000402             this-&gt;<a class="code" href="classBufFragGroup.html#n4">length</a> += frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>;
40100403
40200404             <a class="code" href="group__osclmemory.html#a11">oscl_memcpy</a>(local_fragment.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a>, frag.<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a>, frag.<a class="code" href="structOsclMemoryFragment.html#m0">len</a>*<span class="keyword">sizeof</span>(uint8));
40300405
40400406             <span class="keywordflow">if</span> (location_offset &gt;= 0 &amp;&amp; location_offset &lt; (int32) this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>)
40500407             {
40600408                 <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classBufFragGroup.html#n0">fragments</a>[location_offset].<a class="code" href="structOsclMemoryFragment.html#m1">ptr</a>)
40700409                 {
40800410                     <span class="comment">// make room for the new fragment</span>
40900411                     <a class="code" href="group__osclmemory.html#a12">oscl_memmove</a>(this-&gt;fragments + location_offset + 1, this-&gt;fragments + location_offset,
41000412                                  (this-&gt;num_fragments - location_offset)*<span class="keyword">sizeof</span>(<a class="code" href="classBufferFragment.html">BufferFragment</a>));
41100413                     <a class="code" href="group__osclmemory.html#a12">oscl_memmove</a>(this-&gt;buffer_states + location_offset + 1, this-&gt;buffer_states + location_offset,
41200414                                  (this-&gt;num_fragments - location_offset)*<span class="keyword">sizeof</span>(<a class="code" href="classBufferState.html">BufferState</a>*));
41300415                     ++this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>; <span class="comment">/* increment the number of fragments if a move</span>
41400416 <span class="comment">                                * is necessary.  If the location was empty, then</span>
41500417 <span class="comment">                                * has already been reserved and counted.</span>
41600418 <span class="comment">                                */</span>
41700419                 }
41800420                 this-&gt;<a class="code" href="classBufFragGroup.html#n0">fragments</a>[location_offset] = local_fragment;
41900421                 this-&gt;<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[location_offset] = <a class="code" href="group__osclbase.html#a81">NULL</a>;
42000422                 <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s0">MediaStatusClass::BFG_SUCCESS</a>;
42100423             }
42200424
42300425             <span class="comment">// append the new fragment to the end</span>
42400426             this-&gt;<a class="code" href="classBufFragGroup.html#n0">fragments</a>[this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>] = local_fragment;
42500427             this-&gt;<a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[this-&gt;<a class="code" href="classBufFragGroup.html#n3">num_fragments</a>++] = <a class="code" href="group__osclbase.html#a81">NULL</a>;
42600428             <span class="keywordflow">return</span> <a class="code" href="classBufFragStatusClass.html#s8s0">MediaStatusClass::BFG_SUCCESS</a>;
42700429         };
42800430
429<a name="l00431"></a><a class="code" href="classMediaData.html#n0">00431</a>         <a class="code" href="group__osclutil.html#a2">MediaTimestamp</a> <a class="code" href="classMediaData.html#n0">timestamp</a>;
430<a name="l00432"></a><a class="code" href="classMediaData.html#n1">00432</a>         uint8 <a class="code" href="classMediaData.html#n1">localbuf</a>[local_bufsize];
431<a name="l00433"></a><a class="code" href="classMediaData.html#n2">00433</a>         uint32 <a class="code" href="classMediaData.html#n2">available_localbuf</a>;
43200434
433<a name="l00435"></a><a class="code" href="classMediaData.html#n3">00435</a>         <span class="keywordtype">int</span> <a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>;
43400436 };
43500437
43600438 <span class="preprocessor">#endif</span>
43700439 <span class="preprocessor"></span>
438</pre></div><hr size="1"><img src="pvlogo_small.jpg"><address style="align: right;"><small>OSCL API</small>
439<address style="align: left;"><small>Posting Version: OPENCORE_20090310 </small>
440</small></address>
441</body>
442</html>
443