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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> </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> <<span class="keyword">class</span> T> <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-><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> <<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags> <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 < <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]-><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>& 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> > 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 >= 0 && location_offset < (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-><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-><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> <<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags> <span class="keyword">inline</span> <a class="code" href="classBufferFragment.html">BufferFragment</a> * <a class="code" href="group__osclutil.html#a48">BufFragGroup<ChainClass, max_frags> :: GetFragment</a>(<span class="keyword">const</span> int32 idx) 24300245 { 24400246 <span class="keywordflow">if</span> (idx < (int)num_fragments && idx >= 0) 24500247 { 24600248 <span class="keywordflow">return</span> & <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> <<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags> <span class="keyword">inline</span> <a class="code" href="classBufferState.html">BufferState</a> * <a class="code" href="group__osclutil.html#a49">BufFragGroup<ChainClass, max_frags> :: GetBufferState</a>(<span class="keyword">const</span> int32 idx) 25500257 { 25600258 <span class="keywordflow">if</span> (idx < (int)num_fragments && idx >= 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> <<span class="keyword">class</span> ChainClass, u<span class="keywordtype">int</span>32 max_frags, u<span class="keywordtype">int</span>32 local_bufsize> <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><ChainClass, max_frags> 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>& fragment) 29900301 { 30000302 <span class="keywordflow">if</span> (fragment.<a class="code" href="structOsclMemoryFragment.html#m0">len</a> > <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 < this-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a>; ++ii) 31500317 { 31600318 <span class="keywordflow">if</span> (this-><a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[ii]) 31700319 { 31800320 this-><a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[ii]-><a class="code" href="classBufferState.html#a3">decrement_refcnt</a>(); 31900321 } 32000322 } 32100323 this-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a> = 0; 32200324 this-><a class="code" href="classBufFragGroup.html#n4">length</a> = 0; 32300325 <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(this->buffer_states, 0, <span class="keyword">sizeof</span>(this->buffer_states)); 32400326 <a class="code" href="group__osclmemory.html#a14">oscl_memset</a>(this->fragments, 0, <span class="keyword">sizeof</span>(this->fragments)); 32500327 this-><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>& 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> >= <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> < <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 < <a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>; ii++) 34800350 num_reserved += this-><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-><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-><a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>; 35600358 <span class="keywordflow">if</span> (tmp > this-><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> & this-><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-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a> >= this-><a class="code" href="classMediaData.html#n3">num_reserved_fragments</a>) 36900371 <span class="keywordflow">return</span> this-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a> - this-><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>& frag, 37600378 int32 location_offset) 37700379 { 37800380 37900381 <span class="keywordflow">if</span> (this-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a> > 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> > <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-><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 >= 0 && location_offset < (int32) this-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a>) 40500407 { 40600408 <span class="keywordflow">if</span> (this-><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->fragments + location_offset + 1, this->fragments + location_offset, 41000412 (this->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->buffer_states + location_offset + 1, this->buffer_states + location_offset, 41200414 (this->num_fragments - location_offset)*<span class="keyword">sizeof</span>(<a class="code" href="classBufferState.html">BufferState</a>*)); 41300415 ++this-><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-><a class="code" href="classBufFragGroup.html#n0">fragments</a>[location_offset] = local_fragment; 41900421 this-><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-><a class="code" href="classBufFragGroup.html#n0">fragments</a>[this-><a class="code" href="classBufFragGroup.html#n3">num_fragments</a>] = local_fragment; 42500427 this-><a class="code" href="classBufFragGroup.html#n1">buffer_states</a>[this-><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